exec 函数在 Python 2 和 Python 3 之间表现出不同的行为。在 Python 2 中,exec 是一个语句,而在Python 3中,它已经转变为函数。这种区别对其与局部变量的交互具有重要意义。
在 Python 2 中,exec 语句允许修改函数作用域内的局部变量。执行 exec 语句时,Python 编译器会暂时禁用局部作用域优化,并切换到较慢的查找策略来访问局部变量和全局变量。此外,如果未提供显式全局变量和局部变量参数,则 exec 语句中声明的任何变量都会自动复制回函数的局部变量。
在 Python 3 中, exec()函数严格遵循函数作用域的规则。它不能再修改函数局部范围内的变量,即使它们之前已经声明过。 Locals() 能够在一个方向上反映局部变量,但从未支持通过 locals() 进行修改。
为了实现在 Python 2 中观察到的所需行为,它在 Python 3 中调用 exec() 时,有必要使用单独的命名空间。通过将自定义字典传递给 exec() 函数,可以修改和访问该命名空间内的变量。
下面的代码演示了在 Python 3 中使用 exec() 的正确方法:
def execute(a, st): namespace = {} exec("b = {}\nprint('b:', b)".format(st), namespace) print(namespace['b'])
此方法确保函数的本地作用域保持不变,同时仍然允许修改定义的命名空间内的变量。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3