繁体   English   中英

Python如何处理全局变量?

[英]How does Python handle globals?

我在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正在使用哪些规则来处理其奇怪的范围?

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

基本上,有两个规则:

  1. 当您只读取变量(在范围内)时,Python将沿着范围链向上移动,直到找到该名称的变量。
  2. 当您至少写入一次变量时,Python将始终在当前范围内创建变量。

但是,您可以更改#2的行为:

  • 如果希望名称引用模块级变量,则可以使用global my_module_variable 当您现在写入my_module_variable ,Python将不会创建局部变量。
  • 从Python 3开始,您还可以使用名称引用封闭范围中的变量:使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM