Wat doet de Python nonlocal
-instructie (in Python 3.0 en hoger)?
Er is geen documentatie op de officiële Python-website en help("nonlocal")
werkt ook niet.
Antwoord 1, autoriteit 100%
Vergelijk dit, zonder nonlocal
te gebruiken:
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
Hiertoe, met behulp van nonlocal
, waar inner()
‘s x
nu ook outer()
‘s 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
Als we
global
zouden gebruiken, zou hetx
binden aan de juiste “algemene” waarde: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
Antwoord 2, autoriteit 18%
Kortom, hiermee kunt u waarden toewijzen aan een variabele in een buitenste (maar niet-globaal) bereik. Zie PEP 3104voor alle bloederige details.
Antwoord 3, autoriteit 8%
Een Google-zoekopdracht naar “python nonlocal” leverde het voorstel op, PEP 3104, die de syntaxis en redenering achter de verklaring volledig beschrijft. kortom, het werkt op precies dezelfde manier als de global
-instructie, behalve dat het wordt gebruikt om te verwijzen naar variabelen die noch globaal, noch lokaal voor de functie zijn.
Hier is een kort voorbeeld van wat u hiermee kunt doen. De tellergenerator kan worden herschreven om dit te gebruiken, zodat het meer lijkt op het idioom van talen met sluitingen.
def make_counter():
count = 0
def counter():
nonlocal count
count += 1
return count
return counter
Natuurlijk zou je dit als een generator kunnen schrijven, zoals:
def counter_generator():
count = 0
while True:
count += 1
yield count
Maarhoewel dit een perfect idiomatische python is, lijkt het erop dat de eerste versie iets meer voor de hand ligt voor beginners. Het correct gebruiken van generatoren, door de geretourneerde functie aan te roepen, is een veelvoorkomend punt van verwarring. De eerste versie retourneert expliciet een functie.
Antwoord 4, autoriteit 4%
@ooboo:
Het neemt degene die ‘het dichtst’ bij het referentiepunt in de broncode ligt.
Dit wordt “Lexical scoping” genoemd en is al >40 jaar standaard.
De klasleden van Python staan echt in een woordenboek met de naam __dict__
en zullen nooit worden bereikt via lexicale scoping.
Als u nonlocal
niet opgeeft maar x = 7
doet, wordt een nieuwe lokale variabele “x” gemaakt.
Als u nonlocal
opgeeft, zal het de “dichtstbijzijnde” “x” vinden en daaraan toewijzen.
Als u nonlocal
opgeeft en er is geen “X”, geeft het u een foutmelding.
Het trefwoord global
leek altijd vreemd aan mij omdat het graag alle andere “x” zal negeren, behalve de buitenste. Raar.
Antwoord 5, Autoriteit 3%
Help (‘nonlocal’)
Denonlocal
verklaring
nonlocal_stmt ::= "nonlocal" identifier ("," identifier)*
De
nonlocal
Verklaring zorgt ervoor dat de vermelde identifiers verwijzen naar
eerder gebonden variabelen in de dichtstbijzijnde omsluitende reikwijdte. Dit is
belangrijk omdat het standaardgedrag voor binding is om de
lokale naamruimte eerst. De instructie maakt ingekapselde code toe
herbinden variabelen buiten de lokale scope naast het globale
(module) scope.Namen vermeld in een
nonlocal
verklaring, in tegenstelling tot die vermeld in een
global
Verklaring, moet verwijzen naar reeds bestaande bindingen in een
Omsluitende reikwijdte (de reikwijdte waarin een nieuwe binding moet worden gemaakt
kan niet ondubbelzinnig worden bepaald).Namen vermeld in een
nonlocal
verklaring mogen niet botsen met pre-
bestaande bindingen in de lokale reikwijdte.Zie ook:
PEP 3104 – Toegang tot namen in de buitenste scopes
De specificatie voor denonlocal
verklaring.Gerelateerde Help-onderwerpen: Global, Namespaces
Bron: python taal referentie
Antwoord 6, Autoriteit 2%
Citaat van de python 3 referentie :
De nonlocale verklaring zorgt ervoor dat de vermelde identifiers verwijzen naar eerder gebonden variabelen in de dichtstbijzijnde omsluitende reikwijdte die globalen uitsluit.
Zoals gezegd in de referentie, in het geval van verschillende geneste functies alleen variabele in de dichtstbijzijnde omsluitende functie is gewijzigd:
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
De “dichtstbijzijnde” variabele kan verschillende niveaus weg zijn:
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
Maar het kan geen globale variabele zijn:
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
Antwoord 7
Mijn persoonlijke begrip van de verklaring “Nonlocal” (en excuseer me zoals ik nieuw ben voor python en programmering in het algemeen) is dat het “nonlocal” een manier is om de globale functionaliteit binnen herhereedelijke functies te gebruiken in plaats van het lichaam van de code zelf. Een globale verklaring tussen functies als u dat wilt.
Antwoord 8
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)
Antwoord 9
met ‘niet-lokale’ innerlijke functies (dwz geneste innerlijke functies) kunnen worden gelezen & ‘schrijf‘ toestemming voor die specifieke variabele van de buitenste bovenliggende functie. En niet-lokaal kan alleen binnen innerlijke functies worden gebruikt
bv:
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)