封闭函数范围搜索?

2024-04-23 20:57:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我是编程新手,略读了一些关于函数和类的主题。 所以在阅读了函数和封闭函数之后,我试图通过只对函数及其作用域进行微填充来模拟类中的继承搜索。你知道吗

示例:

对于代码

def f1():
    t=1
    def f2(x):
        return eval(x)
    return f2

为什么我在做这件事时会出现名字错误

f1()('t') #expecting 1 return

但不是说什么时候

def f1():
    t=1
    def f2():
         return t
    return f2

f()() # 1 is returned here

我可以通过将t定义为f2范围内的非局部来解决这个问题,这意味着第一个代码只在f2的局部范围内查看。为什么会这样?`你知道吗


Tags: 函数代码示例主题returndef编程eval
1条回答
网友
1楼 · 发布于 2024-04-23 20:57:14

这里的问题是eval的上下文。默认情况下,eval使用调用它的环境中的局部变量和全局变量。如果我们写:

def f1():
    t = 1

    def f2(x):
        return eval(x)
    return f2

那么在f2内部,t既不包含在全局变量中,也不包含在局部变量中,因此eval语句将无法访问它。如果在f2中实际使用了t,Python只会将t添加到f2的局部变量中。因此,令人有些意外的是,以下代码将正确执行:

def f1():
    t = 1

    def f2(x):
        print(t)
        return eval(x)
    return f2

因为t现在在f2中使用。确保这一点始终有效的更好方法是执行以下操作:

def f1():
    t = 1
    eval_globals = globals()
    eval_locals = locals()

    def f2(x):
        return eval(x, eval_globals, eval_locals)
    return f2

这将覆盖eval的上下文,提供f1范围内的全局变量和局部变量。你知道吗

一个警告,因为你提到你是一个新的程序员:一般来说,你应该避免eval语句,除非你有充分的理由使用它们。有更好的方法来实现你在这里做的事情,而不诉诸评估。你知道吗

相关问题 更多 >