347 Stimmen

Warum ist das Schlüsselwort "global" nicht erforderlich, um auf eine globale Variable zuzugreifen?

Nach meinem Verständnis hat Python einen separaten Namensraum für Funktionen, wenn ich also eine globale Variable in einer Funktion verwenden möchte, sollte ich wahrscheinlich global .

Allerdings konnte ich auf eine globale Variable auch ohne global :

>>> sub = ['0', '0', '0', '0']
>>> def getJoin():
...     return '.'.join(sub)
...
>>> getJoin()
'0.0.0.0'

Habe ich etwas übersehen?

437voto

unode Punkte 8741

Das Schlüsselwort global ist nur nützlich, um globale Variablen in einem lokalen Kontext zu ändern oder zu erstellen, obwohl die Erstellung globaler Variablen selten als gute Lösung angesehen wird.

def bob():
    me = "locally defined"    # Defined only in local context
    print(me)

bob()
print(me)     # Asking for a global variable

Die obigen Angaben geben Ihnen:

locally defined
Traceback (most recent call last):
  File "file.py", line 9, in <module>
    print(me)
NameError: name 'me' is not defined

Wenn Sie jedoch die global Anweisung wird die Variable "außerhalb" des Geltungsbereichs der Funktion verfügbar, sie wird effektiv zu einer globalen Variablen.

def bob():
    global me
    me = "locally defined"   # Defined locally but declared as global
    print(me)

bob()
print(me)     # Asking for a global variable

Mit dem obigen Code erhalten Sie also:

locally defined
locally defined

Darüber hinaus können Sie aufgrund der Natur von Python auch global um Funktionen, Klassen oder andere Objekte in einem lokalen Kontext zu deklarieren. Obwohl ich davon abraten würde, da es Alpträume verursacht, wenn etwas schief geht oder eine Fehlersuche erforderlich ist.

255voto

Ivo Wetzel Punkte 45471

Sie können zwar auf globale Variablen ohne die global Schlüsselwort, wenn Sie sie ändern wollen, müssen Sie das global Stichwort. Zum Beispiel:

foo = 1
def test():
    foo = 2 # new local foo

def blub():
    global foo
    foo = 3 # changes the value of the global foo

In Ihrem Fall greifen Sie einfach auf die Liste zu sub .

90voto

pycruft Punkte 61389

Dies ist der Unterschied zwischen dem Zugriff auf den Namen und verbindlich es innerhalb eines Bereichs.

Wenn Sie nur nach einer Variablen suchen, um ihren Wert zu lesen, haben Sie sowohl Zugang zum globalen als auch zum lokalen Bereich.

Wenn Sie jedoch einer Variablen zuweisen, deren Name sich nicht im lokalen Bereich befindet, sind Sie verbindlich diesen Namen in diesen Bereich (und wenn dieser Name auch als global existiert, wird das ausgeblendet).

Wenn Sie den globalen Namen zuweisen wollen, müssen Sie dem Parser sagen, dass er den globalen Namen verwenden soll, anstatt einen neuen lokalen Namen zu binden - was das Schlüsselwort "global" tut.

Das Binden an einer beliebigen Stelle innerhalb eines Blocks bewirkt, dass der Name überall in diesem Block gebunden wird, was einige recht seltsam anmutende Folgen haben kann (z. B. UnboundLocalError, der plötzlich in zuvor funktionierendem Code auftaucht).

>>> a = 1
>>> def p():
    print(a) # accessing global scope, no binding going on
>>> def q():
    a = 3 # binding a name in local scope - hiding global
    print(a)
>>> def r():
    print(a) # fail - a is bound to local scope, but not assigned yet
    a = 4
>>> p()
1
>>> q()
3
>>> r()
Traceback (most recent call last):
  File "<pyshell#35>", line 1, in <module>
    r()
  File "<pyshell#32>", line 2, in r
    print(a) # fail - a is bound to local scope, but not assigned yet
UnboundLocalError: local variable 'a' referenced before assignment
>>>

61voto

kindall Punkte 167554

Die anderen Antworten beantworten Ihre Frage. Eine weitere wichtige Sache, die man über Namen in Python wissen sollte, ist, dass sie entweder lokal oder global auf einer Pro-Scope-Basis sind.

Nehmen wir zum Beispiel dies:

value = 42

def doit():
    print value
    value = 0

doit()
print value

Sie können sich wahrscheinlich denken, dass die value = 0 Anweisung wird einer lokalen Variablen zugewiesen und wirkt sich nicht auf den Wert der gleichen Variable aus, die außerhalb der doit() Funktion. Sie werden vielleicht überrascht sein, dass wird der obige Code nicht ausgeführt. Die Erklärung print value innerhalb der Funktion erzeugt eine UnboundLocalError.

Der Grund dafür ist, dass Python bemerkt hat, dass Sie an anderer Stelle in der Funktion den Namen value und auch value wird nirgends erklärt global . Das macht sie zu einer lokalen Variablen. Aber wenn Sie versuchen, sie zu drucken, ist der lokale Name noch nicht definiert. Python in diesem Fall fällt nicht zurück um den Namen als globale Variable zu suchen, wie es einige andere Sprachen tun. Grundsätzlich können Sie nicht auf eine globale Variable zugreifen, wenn Sie eine lokale Variable mit demselben Namen definiert haben überall in der Funktion.

17voto

user225312 Punkte 117771

Der Zugriff auf einen Namen und die Zuweisung eines Namens sind unterschiedlich. In Ihrem Fall greifen Sie nur auf einen Namen zu.

Wenn Sie eine Variable innerhalb einer Funktion zuweisen, wird diese Variable als lokal betrachtet, es sei denn, Sie erklären sie als global. Ist dies nicht der Fall, gilt sie als global.

>>> x = 1         # global 
>>> def foo():
        print x       # accessing it, it is global

>>> foo()
1
>>> def foo():   
        x = 2        # local x
        print x 

>>> x            # global x
1
>>> foo()        # prints local x
2

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X