为什么这两个示例似乎以不同的方式处理局部/全局变量赋值?



示例 1:

x = 5
def dE():
x = 6 + x
print(x)
dE()
print(x)

其中输出:

UnboundLocalError: local variable 'x' referenced before assignment

示例 2:

x = [1,8,2,1,6,3,7,6,4,12,13]
def dE():
i = len(x) - 1
while (i >= 0):
currVal = x[i]
if (currVal % 2 == 0):
del(x[i])
i = i - 1
print(x)
dE()
print(x)

其中输出:

[1, 1, 3, 7, 13]
[1, 1, 3, 7, 13]

在 Python 中定义函数时,我的理解是,函数(局部)内发生的变量赋值不会影响(或创建)函数(全局)外部的变量,反之亦然,除非它们在函数中被显式调用为global

这可以在示例 1 中看到,其中函数尝试将6 + x分配给x但不能,因为x以前未在函数中定义,并且从未声明为global

但是,在示例 2 中,将列表分配给函数外部/之前x。然后,在函数中,x既没有声明global也没有定义,就像示例 1 一样,但可以在函数中使用和操作。此外,在函数定义的末尾和调用函数后的函数定义外部打印x会给出相同的结果。

这两个例子有什么区别?

赋值是关键。在第二种情况下,现有变量发生突变,但未赋值

您可以读取和修改现有的全局变量,但不能在没有全局语句的情况下将新对象分配给变量。

最新更新