我是编程新手,略读了一些关于函数和类的主题。 所以在阅读了函数和封闭函数之后,我试图通过只对函数及其作用域进行微填充来模拟类中的继承搜索。你知道吗
示例:
对于代码
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的局部范围内查看。为什么会这样?`你知道吗
这里的问题是eval的上下文。默认情况下,eval使用调用它的环境中的局部变量和全局变量。如果我们写:
那么在
f2
内部,t
既不包含在全局变量中,也不包含在局部变量中,因此eval语句将无法访问它。如果在f2
中实际使用了t
,Python只会将t
添加到f2
的局部变量中。因此,令人有些意外的是,以下代码将正确执行:因为
t
现在在f2
中使用。确保这一点始终有效的更好方法是执行以下操作:这将覆盖eval的上下文,提供
f1
范围内的全局变量和局部变量。你知道吗一个警告,因为你提到你是一个新的程序员:一般来说,你应该避免eval语句,除非你有充分的理由使用它们。有更好的方法来实现你在这里做的事情,而不诉诸评估。你知道吗
相关问题 更多 >
编程相关推荐