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
>>>