Python yerel olmayan iddia

Python nonlocal ifadesi nonlocal (Python 3.0 ve sonraki sürümlerde)?

Resmi Python web sitesinde hiçbir belge ve help("nonlocal") .

220
11 авг. ooboo 11 Ağustos ayarlayın . 2009-08-11 20:36 '09, 20:36 2009-08-11 20:36
@ 9 cevap

nonlocal olmayan kullanmadan bunu karşılaştırın:

 x = 0 def outer(): x = 1 def inner(): x = 2 print("inner:", x) inner() print("outer:", x) outer() print("global:", x) # inner: 2 # outer: 1 # global: 0 

Bunu yapmak için, nonlocal kullanarak inner() x şimdi de outer() x :

 x = 0 def outer(): x = 1 def inner(): nonlocal x x = 2 print("inner:", x) inner() print("outer:", x) outer() print("global:", x) # inner: 2 # outer: 2 # global: 0 

global olsaydık, x doğru “global” değere bağlardı:

 x = 0 def outer(): x = 1 def inner(): global x x = 2 print("inner:", x) inner() print("outer:", x) outer() print("global:", x) # inner: 2 # outer: 1 # global: 2 
327
11 авг. Cevapla Anon 11 ağustos. 2009-08-11 20:53 '09, 20:53 2009-08-11 20:53

Kısacası, bir dış (ancak genel olmayan) etki alanındaki bir değişkene değer atamanıza olanak tanır. Tüm kandil ayrıntıları için PEP 3104'e bakınız.

border=0
72
11 авг. Cevap Arkady 11 Ağustos tarafından verildi . 2009-08-11 20:40 '09, 20:40, 2009-08-11 20:40

"Python nonlocal" için Google'da arama önerisi

35
11 авг. Cevap SingleNegationElimination 11 ağustos ayında verilmiştir . 2009-08-11 20:50 '09, 20:50, 2009-08-11 20:50

yerel olmayan operatöre yardım ('yerel olmayan')


  nonlocal_stmt ::= "nonlocal" identifier ("," identifier)* 

Yerel nonlocal operatör, listelenen tanımlayıcıların en yakın örtü alanındaki önceden bağlı değişkenleri referans nonlocal neden olur. Bir bağlama için varsayılan davranış, yerel ad alanını aramak olduğundan bu önemlidir. Bu operatör kapsüllenmiş kodun global (modüle) ek olarak yerel kapsam dışındaki değişkenleri yeniden düzenlemesine izin verir.

global nonlocal talimatlarda listelenen isimler, global listelenenlerin aksine, daha önce varolan bağları belirtmelidir (içinde yeni bir bağlamanın oluşturulacağı alan) benzersiz olarak belirlenemez).

nonlocal ifadede listelenen isimler, yerel kapsamda önceden var olan bağlayıcılara nonlocal .

Ayrıca bakınız:

PEP 3104 - dış alanlarda isimlere erişim
nonlocal operatör için şartname.

İlgili Yardım konuları: global, NAMESPACES

Kaynak: Python Dil Başvurusu

14
04 авг. Yossi Truzman 04 Ağustos tarafından verilen cevap . 2011-08-04 14:01 '11 14:01 2011-08-04 14:01

@ooboo:

Kaynak koddaki referans noktasına "en yakın" olanı alır. Buna "Lexical Scoping" denir ve> 40 yıl boyunca standarttır.

Python sınıfının üyeleri aslında __dict__ adlı bir sözlüktedir ve hiçbir zaman sözcüksel anlamlarla ulaşılmaz.

nonlocal belirtmez, ancak x = 7 nonlocal , yeni bir yerel değişken "x" oluşturur. nonlocal belirtirseniz, "en yakın" "x" i bulur ve atar. nonlocal belirtirseniz ve "x" yoksa, size bir hata mesajı verir.

global bana her zaman garip geldi, çünkü en dışardakiler hariç, diğer tüm "x" leri görmezden gelecek. Garip.

12
05 дек. Cevap Danny Milosavljeviç'e 05 Aralık'ta verildi . 2010-12-05 16:30 '10 4:30 pm 2010-12-05 16:30
 a = 0 #1. global variable with respect to every function in program def f(): a = 0 #2. nonlocal with respect to function g def g(): nonlocal a a=a+1 print("The value of 'a' using nonlocal is ", a) def h(): global a #3. using global variable a=a+5 print("The value of a using global is ", a) def i(): a = 0 #4. variable separated from all others print("The value of 'a' inside a function is ", a) g() h() i() print("The value of 'a' global before any function", a) f() print("The value of 'a' global after using function f ", a) 
3
06 мая '15 в 16:11 2015-05-06 16:11 Cevap gxyd 06 mayıs 15 'te 16:11 2015-05-06 16:11 tarihinde verilmiştir.

"Yerel olmayan" ifadeyi benim kişisel anlayışım (ve Python'da ve genel olarak programlamada yeni olduğum için özür dilerim), kodlu kod değil, yinelenen işlevler içinde global işlevselliği kullanmanın "yerel olmayan" yoludur. Bunu yaparsanız, işlevler arasında genel bir ifade.

2
04 авг. Yossi Truzman 04 Ağustos tarafından verilen cevap . 2011-08-04 13:25 '11 13:25 2011-08-04 13:25

"yerel olmayan" iç işlevlerle (yani, iç içe iç işlevler) bu özel değişken için harici bir üst işlev tarafından okunabilir ve " yazılabilir ". Ve yerel olmayan, yalnızca dahili işlevlerin içinde kullanılabilir:

 a = 10 def Outer(msg): a = 20 b = 30 def Inner(): c = 50 d = 60 print("MU LCL =",locals()) nonlocal a a = 100 ans = a+c print("Hello from Inner",ans) print("value of a Inner : ",a) Inner() print("value of a Outer : ",a) res = Outer("Hello World") print(res) print("value of a Global : ",a) 
0
21 марта '18 в 10:28 2018-03-21 10:28 Cevap NIPHIN tarafından 21.08.2018 tarihinde saat 10:28'de verilmiştir. 2018-03-21 10:28

Python 3 Referansından Alıntı:

Yerel olmayan bir operatör, numaralandırılmış tanımlayıcıların, global değişkenler hariç, en yakın kapsamdaki önceden bağlı değişkenlere başvurmalarına neden olur.

Bağlantıda belirtildiği gibi, birkaç iç içe geçmiş işlev durumunda, yalnızca en yakın kapanma işlevindeki değişken değişir:

 def outer(): def inner(): def innermost(): nonlocal x x = 3 x = 2 innermost() if x == 3: print('Inner x has been modified') x = 1 inner() if x == 3: print('Outer x has been modified') x = 0 outer() if x == 3: print('Global x has been modified') # Inner x has been modified 

“En yakın” değişken birkaç seviyede olabilir:

 def outer(): def inner(): def innermost(): nonlocal x x = 3 innermost() x = 1 inner() if x == 3: print('Outer x has been modified') x = 0 outer() if x == 3: print('Global x has been modified') # Outer x has been modified 

Ancak bu global bir değişken olamaz:

 def outer(): def inner(): def innermost(): nonlocal x x = 3 innermost() inner() x = 0 outer() if x == 3: print('Global x has been modified') # SyntaxError: no binding for nonlocal 'x' found 
0
21 марта '18 в 14:27 2018-03-21 14:27 Cevap Jeyekomon tarafından 21.08.18.2002 22:27