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

6

我对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个回答

6
Python在加载模块/脚本时即执行代码。因此,在您的第一个示例中,它不是"在我们调用g时计算的",这只是意味着在执行gp的最新值为5。Python将查找p并返回当前值(5)。
在您的第二个示例中,p是一个局部变量。这意味着全局范围内的p = 6不会影响它。或者更明确地说,在您的第二个示例中,在make_fun()中设置的f()内的p是局部变量。因此,您将获得该值,而不是外部(全局)作用域中的p,其中是不同的p

3
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;

希望我理解你的意思是正确的!


1
这不是评估何时发生的问题。在您提供的两个例子中,p在调用函数时进行评估。真正的问题是变量何时被声明。
在第一个示例中,p在函数外部声明,因此具有全局作用域。对p的任何更改都会影响其在引用它的任何地方的值。
在第二个示例中,您在函数内部声明另一个变量p。这是函数局部变量,不受函数外部代码的影响。即使您继续声明另一个全局p,如f=make_fun()之后的行所示,该全局变量也会在函数内被本地变量覆盖。
作为实验,请在打印f()之后打印p,您将看到其值将是6,就像您赋值的一样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接