Instruilo por la programlingvo Pitono

Bonvolu sendi korektojn, proponojn, kaj sugestojn al vilcxjo ĉe esperanto-me.org

Nomospacoj kaj Valorizado

Nomospacoj estas kreitaj je malsamaj tempopunktoj kaj havas malsamajn vivperiodojn. Kiam oni starigas la interpretilon, la modulo __builtin__ estas kreita, kiu havas sian propran nomospacon. La nomospaco enhavas prafunkciojn kaj primativojn. La instrukcioj plenumitaj je la pli alta nivelo(en skripto aŭ interaktive) estas en modulo nomita __main__, kiu havas sian propran nomospacon. Ĉi tiuj altnivelaj nomospacoj ekzistas dum la vivo de la interpretilo.

La malloka nomospaco por modulo estas kreita kiam la modulo estas enlegita. Kutime, modulaj nomospacoj ekzistas dum la vivo de la intepretilo. Du aŭ pli moduloj povas difini saman funkcion aŭ variablon. Se oni uzas la modulojn samptempe, oni devas prefiksi la funkcion aŭ variablon per modula nomo - modulonomo.funkcionomo.

Funkciaj Nomospacoj

 La loka nomspaco por funkcio estas kreita kiam oni vokas la funkcion. La nomospaco estas forigita (fakte, forgesita) kiam la funkcio resendas rezulton. Rekursia voko de funkcio kreas apartan nomospacon.

La farado de funkcio kreas novan tabelon de simboloj, uzita por la lokaj variabloj de la funkcio. Pli precize, ĉiu variabla asigno en funkcio konservas la valoron en loka simboltabelo. Je variabla aludo, Pitono serĉas (1) la lokan simboltabelon, (2) sekve en simboltabeloj en enfermantaj funkcioj, (3) sekve en malloka simboltabelo (modjula simboltabelo kie oni deklaras la funkcion), (4) sekve en tabelo de nomoj de prafunkcioj (simboltabelo je la plej alta nivelo de Pitono).

Funkcio ne asignas valoron al malloka variablo (krom ĝi eksplicite deklaras mallokan variablon) sed ĝi povas aludi al mallokaj variabloj.

Ekzemplo:

a = 1
b = 'x'

def f1():
a = 2
def f2():
print 'f2', a #variablo el enfermanta funkcio
def f3():
a = 3
print 'f3', a #loka variablo
print 'f3', b #malloka variablo
f3()
f2()
f1()

f2 2
f3 3
f3 x

Rimarku, ke asigno al variablo ie ajn en funkcio igas tiun variablon esti loka ĉie en la funkcio.

a = 9 #malloka
def mia_difino(c):
d = a + c # d-loka
# a ŝajne estas malloka, sed ne pro sekva asigno
print a, c
   a = 2
# a iĝas loka ĉie en la funkcio
 
mia_difino(8)
 
Traceback (innermost last):
mia_difino
d = a + c # d-loka,
NameError: a

Mallokaj variabloj

Pitono ne provizas kapablecon aŭtomate difini variablon havebla al ĉiu modulo en programo. La plej alta nomospaco estas modula.

Per al uzo de la komando global oni puŝas variablon en la modulan simboltabelon.

def a():
global x
x = 10
#x iĝas 10 ĉie en la modulo
return

def b():
print x
return

a()
b()

10

La efektivaj parametroj (argumentoj) de funkcia voko estas enkondukitaj en la lokan simboltabelon de la vokita funkcio kiam la voko okazas; tial, argumentoj estas senditaj per asigno.

Se argumento estas neŝanĝebla objekto, ĝi estas sendita efektive per valoro. (numeroj, ĉenoj estas neŝanĝeblaj).

Se argumento estas ŝanĝebla objekto, ĝi estas sendita efektive per referenco ĝis kiam vi asignas al la tuta objekto. (Listoj estas ŝanĝiĝeblaj)

Ekz.

>>>a = 'abc'     # ĉeno
>>>b = [5,'sss']
# listo
 
>>>def funk(a,b):
...   a = a + 'def'
# rezulto estas loka - 'abcdef'
...   b[0] = 10    
#listero ŝanĝita
...
>>>f = funk(a,b)
>>>print a
# neŝanĝita ĉeno
'abc'
>>>print b[0]
# ŝanĝita listero
10

Se funkcio estas interna al alia funkcio, lokaj variabloj de la eksterna funkcio estas havebla al la interna funkcio.

Ekz.

>>>def eksterna():
... c = 1
... def interna():
... d = c + 1
... return d
... print interna()
...
>>>eksterna()

2

Klasaj Nomospacoj

Uzo de variabloj (sen kvalifikiĝo) en klasoj estas similaj al uzo en funkcioj

Do:

   a = 1   #a estas loka al la modulo
class KlasNomo:  
   b = a    
#b estas loka al la klaso
def f(q): 
#funkcio loka al la klaso
c = a
#c estas loka al la funkcio - a estas malloka
d = b + 1
#eraro - b ne estas havebla
          # ne estas (1) loka,(2) malloka, aŭ
          # 3) primativa

Simile al funkcioj, malloka amplekso de klaso estas la modulo kie la klaso estas difinita. (La klaso mem neniam estas la malloka amplekso!)

 

Amplekso

Amplekso is teksta regiono en Pitona programo kie nomospaco estas rekte atingebla. 'Rekte atingebla' signifas, ke senkvalifikita aludo al la nomo rezultas en provo trovi la nomon en la nomospaco.

Se oni deklaras nomon global, ĉiu aludo aŭ valorizo iras rekte al la meza amplekso kiu havas la mallokajn nomojn de la modulo. Alie, valorizo de variablo okazas en la plej interna amplekso, kaj ĉiu variablo trovita ekster la plej interna amplekso estas nur legebla.

Rimarku, ke ampleksoj estas difinitaj laŭtekste. la malloka amplekso de funkcio difinita en modulo estas la nomospaco de tiu modulo, eĉ se la funkcio estas vokita en alia modulo, alia funkcio, aŭ per kromnomo.

Valorizado

Kutime variablo estas valorizita en la plej interna amplekso. Valorizo ne kopias variablon-- ĝi nur kunligas nomom al objekto. Rezultoj de la valorizo de ŝanĝeblaj variabloj ofte estas neatenditaj.

Ekz.

ListoA = [1,2,3]
ListoB = ListoA   
ListoA[1] = 'x'
>>>print ListoA

[1,x,3]
>>>print ListoB #ListoB estas nur kromnomo de ListoA
[1,x,3]
  

Por kopii liston:

ListoA = [1,2,3]
ListoB = ListoA[:] #ListoB estas sendependa kopio de ListoA
ListoA[1] = 'x'
>>>print ListoA

[1,x,3]
>>>print ListoB
[1,2,3]

Supren