Python niet-lokaal statement

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 nonlocalte 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 xnu 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 globalzouden gebruiken, zou het xbinden 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 nonlocalniet opgeeft maar x = 7doet, wordt een nieuwe lokale variabele “x” gemaakt.
Als u nonlocalopgeeft, zal het de “dichtstbijzijnde” “x” vinden en daaraan toewijzen.
Als u nonlocalopgeeft en er is geen “X”, geeft het u een foutmelding.

Het trefwoord globalleek altijd vreemd aan mij omdat het graag alle andere “x” zal negeren, behalve de buitenste. Raar.


Antwoord 5, Autoriteit 3%

Help (‘nonlocal’)
De nonlocalverklaring


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

De nonlocalVerklaring 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 nonlocalverklaring, in tegenstelling tot die vermeld in een
globalVerklaring, 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 nonlocalverklaring 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 de nonlocalverklaring.

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)

Other episodes