是什么区别globals(),locals()和vars()?他们回报了什么?结果更新是否有用?
你如何在Python中动态设置局部变量?
(变量名称是动态的)
更新:我知道这不是一个好的做法,而且这些言论是合法的,但这不是一个坏问题,只是一个更理论的问题 - 我不明白为什么这证明了这一点.
下面的代码给出了不同的输出Python2和在Python3:
from sys import version
print(version)
def execute(a, st):
b = 42
exec("b = {}\nprint('b:', b)".format(st))
print(b)
a = 1.
execute(a, "1.E6*a")
Run Code Online (Sandbox Code Playgroud)
Python2 打印:
2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)]
('b:', 1000000.0)
1000000.0
Run Code Online (Sandbox Code Playgroud)
Python3 打印:
3.2.3 (default, Apr 11 2012, 07:15:24) [MSC v.1500 32 bit (Intel)]
b: 1000000.0
42
Run Code Online (Sandbox Code Playgroud)
为什么Python2将函数b内部的变量绑定到execute函数字符串中的exec值,Python3而不执行此操作?我怎样才能实现Python2in 的行为Python3?我已经尝试将全局和本地的字典传递给exec函数Python3,但到目前为止还没有任何工作.
---编辑---
在阅读了Martijns的回答后,我进一步分析了这一点 …
为什么Python eval不能在函数内部工作?相同的eval(compile(cmd))代码在全局环境中工作,但在foo函数内部不起作用.
简单的例子:
fn = '/tmp/tmp'
mode = 'single'
def foo(cmd, fn, mode):
eval(compile(cmd, fn, mode)) # <<< this does not work
print 'foo: cmd=', cmd
print 'foo: x=', x
cmd = "x = 1"
eval(compile(cmd, fn, mode)) # <<< this works
print 'global scope: cmd=', cmd
print 'global scope: x=', x
del(x)
foo('x = 9', fn, mode)
Run Code Online (Sandbox Code Playgroud)
这是输出和错误消息:
global scope: cmd= x = 1
global scope: x= 1
foo: cmd= x = 9
foo: …Run Code Online (Sandbox Code Playgroud)