请阅读两个代码,我发现唯一的不同是是否打印了locals()。但是其中之一是错误的。 请帮助我,谢谢
import numpy as np
class Solution:
def solve(self, f, a, b, n):
x = np.linspace(a,b,n)
# print(locals())
loc = locals()
fstr = '''
def fun(x):
return %s
''' % f
exec(fstr)
# print(locals())
fun = loc['fun']
y = fun(x)
print(x,y,sep = '\n')
a = Solution()
a.solve('x+1',-5,5,5)
在这段代码中,我没有打印locals()
如果我只打印它并在“ fun = loc ['fun']”和“ y = fun(x)”前面写上“#”,则本地人的输出中有一个名为“ fun”的键( )
import numpy as np
class Solution:
def solve(self, f, a, b, n):
x = np.linspace(a,b,n)
# print(locals())
loc = locals()
fstr = '''
def fun(x):
return %s
''' % f
exec(fstr)
print(locals())
fun = loc['fun']
y = fun(x)
print(x,y,sep = '\n')
a = Solution()
a.solve('x+1',-5,5,5)
但是在这段代码中,我在locals()的输出中找不到名为'fun'的键
Traceback (most recent call last):
File "tmp.py", line 20, in <module>
a.solve('x+1',-5,5,5)
File "tmp.py", line 15, in solve
fun = loc['fun']
KeyError: 'fun'
所有这些似乎都由“ fun = loc ['fun']”和“ y = fun(x)”确定locals()的输出
但是我认为对于python来说,后面的代码无法更改前端代码
答案 0 :(得分:5)
是的,这种情况发生在locals()
上。 locals()
令人困惑,并且没有充分记录。
在同一堆栈帧中重复调用locals()
每次都会返回相同的格言,并且每次调用locals()
updates 时都会使用本地的当前值(或闭包) )变量。字典作为其f_locals
属性附加到堆栈框架,访问该属性也将更新字典。
要安全使用locals()
而不会意外更改值,则应复制返回的字典:
current_locals = locals().copy()
否则,即使在调试器中运行代码也可能会改变其行为,因为调试器通常会访问f_locals
来检查局部变量。
此外,正式支持exec
试图在本地范围内分配任何变量的代码,并且行为异常,def
被视为分配。无论如何,您不应该使用exec
。