函数内部和外部的Python全局列表修改

Python global list modification inside and outside of functions

2我对Python相对较新(使用3.3.3),并且有一个与列表有关的问题。在函数内部修改全局列表变量时(请不要讲授关于全局变量的弊端),通常不需要使用函数内部的global关键字声明列表-只要您坚持使用列表方法即可。特别是,您可能必须先使用global关键字才能使用增强加法。令我惊讶的是,在函数外部使用加法运算显然并没有修改list变量(仅列表内容),因此我希望可以在不使用global关键字的情况下在函数内部使用它。这是我无法调和的两个示例:

1
2
3
4
5
6
7
8
list_1 = []

def my_func():
    list_1.append(0)
    #list_1 += [0]

my_func()
print('list_1 =', list_1)

正如预期的那样,这将打印list_1 = [0],而注释掉的增强加法运算会产生有关在分配之前使用局部变量的投诉。

这是一个我无法与前一个示例保持一致的示例:

1
2
3
4
list_1 = [0]
list_2 = list_1
list_1 += [1]
print('list_2 =', list_2)

这会打印list_2 = [0, 1],这向我暗示list_1 += [1]并未修改list_1变量。我知道list_1 = list[1] + [1]符合修改list_1的资格,但是增强添加似乎没有。为什么在函数内部的加法运算要求使用全局关键字?感谢您的帮助,以帮助您理解这一点。


问题在于,当解析函数主体时,所有在常规分配或扩充分配中使用的变量都被视为局部变量,因此在调用函数时,Python将不会在全局范围内查找这些变量,因此会引发错误。 因此,您需要将这些变量指定为global,以告诉Python在全局范围内查找它们。

另一种选择是使用list.extend()代替+=

有关:

  • 当变量具有值时,为什么会得到UnboundLocalError
  • Python列表+=可迭代的行为是否记录在任何地方?