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

时间:2017-12-10 00:06:45

标签: python

示例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一样,但是IS能够在函数内使用和操作。此外,在函数定义结束时和函数定义之外打印x会产生相同的结果。

这两个例子之间有什么区别?

1 个答案:

答案 0 :(得分:0)

作业是关键。在第二种情况下,现有变量是变异的,但不是分配

您可以读取和修改现有的全局变量,但是如果没有全局语句,则无法将新对象分配给变量。