一个简单的小问题:
exec("a=3")
print(a)
# This will print 3
Run Code Online (Sandbox Code Playgroud)
如果我使用这个:
def func():
exec("a=3")
print(a)
func()
# NameError: name 'a' is not defined.
Run Code Online (Sandbox Code Playgroud)
发生了什么?我如何exec()在函数中为它赋值?
编辑:我发现了一个有同样问题的问题,但仍然没有解决。
你为什么要这么做?
我知道使用exec()是不好的并且不安全。但是最近我尝试解决OP的问题。我遇到了它。
Python 知道几种作用域:模块global、局部函数、nonlocal闭包、类体。值得注意的是,范围解析是在字节码编译时静态定义的定义的 \xe2\x80\x93 最重要的是,名称是否引用本地/非本地或全局作用域都无法更改。
在这些作用域中,只有全局作用域可以保证其行为类似于dict,并且因此是可写的。本地/非本地作用域通常是不可写的,并且不能向其中添加新变量。
exec如果未传入locals,将写入全局范围;然后必须将全局变量显式设置为其默认值globals()。
def func():\n exec("a=\'exec\'", globals()) # access only global scope\n print(a)\n\na = \'global\'\nfunc() # prints exec\nRun Code Online (Sandbox Code Playgroud)\n然而,一旦名称对于函数来说是局部的,exec就无法修改它。
def func():\n a = \'local\' # assignment makes name local\n exec("a=\'exec global\'", globals())\n exec("a=\'exec locals\'", globals(), locals())\n print(a)\n\na = \'global\'\nfunc() # prints local\nRun Code Online (Sandbox Code Playgroud)\n虽然一个dict存在本地/非本地范围的类似表示,但解释器不需要遵守对其的更改。
\n\n当地人()
\n更新并返回表示当前本地符号表的字典。当在功能块中调用 locals() 时,会返回自由变量,但在类块中则不会。请注意,在模块级别,locals() 和 globals() 是相同的字典。
\n\n\n注:本词典内容不得修改;更改可能不会影响解释器使用的局部变量和自由变量的值。
\n
尽管确实exec将 locals 作为 a dict,但它们并不像函数 locals/nonlocals 那样对待。尝试修改默认局部变量(结果locals()未定义
\n\n执行()
\n...如果给出了全局变量和局部变量,则它们分别用于全局变量和局部变量。如果提供的话,局部变量可以是任何映射对象。请记住,在模块级别,全局变量和局部变量是相同的字典。如果 exec 获取两个单独的对象作为全局对象和局部对象,则代码将像嵌入在类定义中一样执行。
\n\n\n注意:默认局部变量的行为如
\nlocals()下面函数所述:不应尝试修改默认局部变量字典。...
| 归档时间: |
|
| 查看次数: |
1638 次 |
| 最近记录: |