我很困惑,因为Python何时评估变量。例如,如果我这样做:
p=4
def g():
return p
p=5
print g()
我得到5,所以在g
的定义中,变量p
仍未被评估。我们在致电g
但是,如果我这样做:
def make_fun():
p=5
def f():
return p
return f
f=make_fun()
p=6
print f()
我得到5.为什么f
不包含未评估的变量p
?我想清楚地了解何时进行变量评估。
答案 0 :(得分:3)
Python在加载模块/脚本时执行代码。因此,在您的第一个示例中,它不是“在我们调用g时进行评估”,它只是意味着p
的最新值在执行g
时为5。 Python将查找p
,它将返回当前值(5)。
在您的第二个示例中,p
是一个局部变量。这意味着它在全局范围内不受p = 6
的影响。或者要明确,第二个示例中p
中的f()
是make_fun()
中设置的局部变量。这就是你将得到的价值,它不是外部(全局)范围内的p
,而是p
。
答案 1 :(得分:2)
p=4 #you are setting global p to 4
def g():
return p
p=5 #you are setting global p to 5
print g() #you are printing the result of g, which is not setting any value;
打印5; 但在这里:
def make_fun():
p=5 #you are setting local p to 5
def f():
return p
return f
f=make_fun()
p=6 #you are setting global p to 6
print f() #you printing the result of a function in f, which is getting the local p
打印本地p = 5;
希望我明白你的意思!答案 2 :(得分:1)
这不是评估何时发生的问题。在两个示例中,在调用函数时会计算p
。真正的问题是该变量何时被声明。
在您的第一个示例中,p
在函数外部声明,因此具有全局范围。 p
的任何更改都会对其引用的任何地方产生影响。
在第二个示例中,您在函数内声明了另一个变量p
。这是函数的本地函数,不受函数外部任何代码的影响。即使你继续在p
之后的行中继续声明另一个全局f=make_fun()
,这个全局变量也会在函数内被局部变量覆盖。
作为实验,请在打印p
后尝试打印f()
,并且您会在分配时看到它的值为6。