Python如何处理全局变量?

Lor*_*ing 3 python

我在Python中遇到了一些奇怪的全局变量处理.我希望有人可以解释并证明这些惊喜!

A)此代码按预期打印10:

def func():
  print(a)
a = 10
func()
Run Code Online (Sandbox Code Playgroud)

B)此代码引发了一个过早引用的异常:

def func():
  print(a)
  a += 1
a = 10
func()
Run Code Online (Sandbox Code Playgroud)

C)但是这段代码按预期打印[10]:

def func():
  print(a)
  a.append(1)
a = [10]
func()
Run Code Online (Sandbox Code Playgroud)

因此,我可以收集到a其范围的变化类型以及后来甚至尚未达到的声明,这些变更的方式也有所改变a.我知道我可以global a在函数的开头使用,但它相当冗长.

任何人都可以告诉我Python正在使用哪些规则来处理其奇怪的范围?

Ign*_*ams 5

第二个实例重新绑定 a,因此编译器为其生成本地访问.另外两个只读取a,因此执行正常的全局范围搜索.