在python3.3中:
x = 1
print('global x =', x)
def f():
exec('x=2')
#x = 2
print('local in f() x =', x)
def g():
print('local in g() x =', x)
g()
f()
在python3.3中为什么结果是这样的:
global x = 1
local in f() x = 1
local in g() x = 1
任何人都可以告诉我为什么exec('x = 2')不等于x = 2
'x = 2'和exec('x = 2')之间有什么区别?
3×
答案 0 :(得分:1)
函数中的本地高度优化并在编译时确定,存储在帧中的数组中。每个本地名称只是字节代码中的索引,索引到该数组中。
另一方面, exec()
尝试将本地处理为可写字典,但在函数内部,locals()
返回的字典不连接到实际的本地数组一个功能。您无法使用exec()
设置本地人。
引用locals()
function文档:
注意:不应修改此词典的内容;更改可能不会影响解释器使用的本地和自由变量的值。
注意:默认 locals 的行为与下面的函数
locals()
相同:对默认 locals 字典的修改不应该是尝试。如果您需要在函数exec()
返回后查看代码对 locals 的影响,请传递显式的 locals 字典。
在函数内添加行x = 2
时,编译器会确定x
是本地的。