下面的代码段在Python 2.7和3.3中输出不同。
为了修复 Python 3.3 中的错误,我只需将全局变量设置为与本地变量相同,即
data = {'_out':[1,2,3,3,4]}
codes = ['_tmp=[]',
'[_tmp.append(x) for x in _out if x not in _tmp]',
'print(_tmp)']
for c in codes:
exec(c,{},data)
Python 2.7的输出:
[1,2,3,4]
Python 3.3 的输出:
Traceback (most recent call last):
File "test.py", line 8, in <module>
exec(c,{},data)
File "<string>", line 1, in <module>
File "<string>", line 1, in <listcomp>
NameError: global name '_tmp' is not defined
为了修复 Python 3.3 中的错误,我只需将全局变量设置为与本地变量相同,即
exec(c,data,data)
。有任何想法为什么 Python 3.3 的表现与 2.7 不同?
Exec
现在是一个函数而不是语句。推导式的主体现在在一个单独的命名空间中执行,而不是包含推导式的命名空间中执行。 - Terry Jan Reedy