Это потому, что Python автоматически действует так, как будто переменная является глобальной, если вы не определите или не попытаетесь изменить ее в функции.Попробуйте добавить global a
в ваш код.
>>> a = 123
>>> def f():
... global a
... print a
... a = 456
... print a
...
>>> f()
123
456
>>> a
456
В первом примере вы не определили и не изменили, так что это был глобальный пример.Но если вы хотите, например, добавить 20 к a, вы также должны использовать global a
.
Также имейте в виду, что функция a in f является глобальной, и ее значение будет отличаться послеВыполнение функции f.
Если вы хотите создать локальную переменную, помните, что объявление всегда идет перед чтением, поэтому print a
нельзя сделать до a = 456
.
РЕДАКТИРОВАТЬ: Хорошо, в то время как мы говорим о замыканиях и опасно использовать глобальные, есть и другая возможность.
>>> a = 123
>>> def f():
... b = a
... print b
... b = 456
... print b
...
>>> f()
123
456
>>> a
123
>>>
Здесь мы используем возможность замыкания только для чтения, чтобы сделать копию а, а затем изменить эту копию,без изменения внешней переменной a
КАК ДОЛГО, КАК ЭТО ИНТЕГЕР.Помните, что b
содержит ссылку на a
.Если a
является, например, списком, а операция f
похожа на b.append(3)
, то и a
, и b
будут доступны и изменены вне области действия.
Выбор изМетод отличается в зависимости от потребностей.