如何使用 exec() 将值传递给 python 函数中的变量?

jiz*_*AMA 3 python python-3.x

一个简单的小问题:

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的问题。我遇到了它。

Mis*_*agi 5

Python 知道几种作用域:模块global、局部函数、nonlocal闭包、类体。值得注意的是,范围解析是在字节码编译时静态定义的定义的 \xe2\x80\x93 最重要的是,名称是否引用本地/非本地或全局作用域都无法更改。

\n

在这些作用域中,只有全局作用域可以保证其行为类似于dict,并且因此是可写的。本地/非本地作用域通常是不可写的,并且不能向其中添加新变量。

\n

exec如果未传入locals,将写入全局范围;然后必须将全局变量显式设置为其默认值globals()

\n
def func():\n    exec("a=\'exec\'", globals())  # access only global scope\n    print(a)\n\na = \'global\'\nfunc()  # prints exec\n
Run Code Online (Sandbox Code Playgroud)\n

然而,一旦名称对于函数来说是局部的,exec就无法修改它。

\n
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\n
Run Code Online (Sandbox Code Playgroud)\n
\n

虽然一个dict存在本地/非本地范围的类似表示,但解释器不需要遵守对其的更改。

\n
\n

当地人()

\n

更新并返回表示当前本地符号表的字典。当在功能块中调用 locals() 时,会返回自由变量,但在类块中则不会。请注意,在模块级别,locals() 和 globals() 是相同的字典。

\n
\n

注:本词典内容不得修改;更改可能不会影响解释器使用的局部变量和自由变量的值。

\n
\n
\n

尽管确实exec将 locals 作为 a dict,但它们并不像函数 locals/nonlocals 那样对待。尝试修改默认局部变量(结果locals()未定义

\n
\n

执行()

\n

...如果给出了全局变量和局部变量,则它们分别用于全局变量和局部变量。如果提供的话,局部变量可以是任何映射对象。请记住,在模块级别,全局变量和局部变量是相同的字典。如果 exec 获取两个单独的对象作为全局对象和局部对象,则代码将像嵌入在类定义中一样执行。

\n
\n

注意:默认局部变量的行为如locals()下面函数所述:不应尝试修改默认局部变量字典。...

\n
\n
\n