首先,我完全理解global陈述的含义和使用方法.
现在,让我们来看看:
x = 100
def f():
global x
global xxx
x = 99
return x
print(f())
# >>> 99
print(x)
# >>> 99
Run Code Online (Sandbox Code Playgroud)
您可以看到,通过使用global x,我成功地在全局环境中更改了x的值.
但是xxx根本不存在,为什么我被允许全局化它甚至不会带来任何错误,即使该函数被执行?
che*_*ner 10
global x没有定义,声明或以其他方式创建x.它只是声明if和when x在当前函数作用域中被赋值(无论该赋值是在global语句之前还是之后,这就是强烈建议global在函数开头使用语句的原因),赋值是该名称的全局变量,而不是局部变量.实际创建仍然是实际任务的工作.
换句话说,global不会自己生成任何字节码; 它只是修改了其他赋值语句可能生成的字节码.考虑这两个功能:
def f():
global x
x = 99
def g():
x = 99
Run Code Online (Sandbox Code Playgroud)
这两个函数的字节代码的唯一区别是在f使用时STORE_GOBAL作为global语句的结果g使用STORE_FAST.
>>> dis.dis(f)
5 0 LOAD_CONST 1 (99)
3 STORE_GLOBAL 0 (x)
6 LOAD_CONST 0 (None)
9 RETURN_VALUE
>>> dis.dis(g)
8 0 LOAD_CONST 1 (99)
3 STORE_FAST 0 (x)
6 LOAD_CONST 0 (None)
9 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)
如果要添加"未使用" global语句,例如in
def h():
global xxx
x = 99
Run Code Online (Sandbox Code Playgroud)
生成的字节代码与以下内容无法区分g:
>>> dis.dis(h)
3 0 LOAD_CONST 1 (99)
2 STORE_FAST 0 (x)
4 LOAD_CONST 0 (None)
6 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
218 次 |
| 最近记录: |