Python何时评估函数定义中的变量

时间:2013-12-30 18:13:06

标签: python variables scope

我很困惑,因为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?我想清楚地了解何时进行变量评估。

3 个答案:

答案 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。