我在Python中遇到了一些奇怪的全局变量处理。我希望有人可以解释并证明这些惊喜!
A)此代码按预期打印10:
def func():
print(a)
a = 10
func()
B)此代码引发了一个过早引用的例外:
def func():
print(a)
a += 1
a = 10
func()
C)但是这段代码按预期打印[10]:
def func():
print(a)
a.append(1)
a = [10]
func()
所以我可以收集a
的类型更改其范围,此外后来甚至尚未达到的语句会改变a
的显示方式。我知道我可以在函数的开头使用global a
,但它相当冗长。
有人能告诉我Python正在使用哪些规则来处理其奇怪的范围?
答案 0 :(得分:5)
第二个实例重新绑定 a
,因此编译器会为其生成本地访问权限。另外两个只读a
,因此执行正常的全局范围搜索。
答案 1 :(得分:4)
基本上,有两条规则:
您可以更改#2的行为,但是:
global my_module_variable
。当您现在写信给my_module_variable
时,Python将不创建一个本地变量。nonlocal my_non_local_variable
使其引用最近的封闭范围中的变量。 B)您正在使用+=
:您正在尝试写入变量。因此规则2生效,它将写入当前范围中的变量。但是,它也必须从中读取(print(a)
),但该变量还没有值,因为您之前没有写过它。 Python不允许您在函数中混合使用规则1.
和规则2.
。
如果您希望func()
使用a = 10
变量,可以像这样更改代码:
>>>> def func()
global a
print(a)
a += 1
>>>> a = 10
>>>> func()
10
>>>> func()
11