Python函数locals()只需调用即可更改

时间:2019-12-10 09:02:08

标签: python function local-variables

请阅读两个代码,我发现唯一的不同是是否打印了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来说,后面的代码无法更改前端代码

1 个答案:

答案 0 :(得分:5)

是的,这种情况发生在locals()上。 locals()令人困惑,并且没有充分记录。

在同一堆栈帧中重复调用locals()每次都会返回相同的格言,并且每次调用locals() updates 时都会使用本地的当前值(或闭包) )变量。字典作为其f_locals属性附加到堆栈框架,访问该属性也将更新字典。

要安全使用locals()而不会意外更改值,则应复制返回的字典:

current_locals = locals().copy()

否则,即使在调试器中运行代码也可能会改变其行为,因为调试器通常会访问f_locals来检查局部变量。


此外,正式支持exec试图在本地范围内分配任何变量的代码,并且行为异常,def被视为分配。无论如何,您不应该使用exec