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

函数内部和外部的Python全局列表修改,python,Python,2我对Python比较陌生(使用3.3.3),有一个与列表相关的问题。在函数中修改全局列表变量时(请不要讲全局变量的坏处),通常不需要在函数中声明带有全局关键字的列表-只要您坚持使用列表方法。特别是,如果不先使用global关键字,就不能使用增广加法。令我惊讶的是,在函数外部使用增广加法显然并没有修改列表变量(仅修改列表内容),因此我希望能够在函数内部使用它,而不使用全局关键字。以下是两个我无法调和的例子: list_1 = [] def my_func(): list_1.appen

2我对Python比较陌生(使用3.3.3),有一个与列表相关的问题。在函数中修改全局列表变量时(请不要讲全局变量的坏处),通常不需要在函数中声明带有全局关键字的列表-只要您坚持使用列表方法。特别是,如果不先使用global关键字,就不能使用增广加法。令我惊讶的是,在函数外部使用增广加法显然并没有修改列表变量(仅修改列表内容),因此我希望能够在函数内部使用它,而不使用全局关键字。以下是两个我无法调和的例子:

list_1 = []

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

my_func()
print('list_1 =', list_1)
这将按预期打印
列表\u 1=[0]
,而注释掉的增广加法操作会生成关于在赋值之前使用局部变量的投诉

这里有一个我无法与前一个相协调的例子:

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

这将打印
list\u 2=[0,1]
,这向我表明
list\u 1+=[1]
没有修改list\u 1变量。我知道
list\u 1=list[1]+[1]
符合修改list\u 1的条件,但增广加法似乎并不适用。为什么函数中的增广加法需要使用全局关键字?感谢您对这一点的帮助。

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

另一种选择是使用
list.extend()
而不是
+=

相关的:


您是否尝试打印
list\u 1
以检查您的假设,即
list\u 1+=[1]
没有修改
list\u 1
?您说“这打印
list\u 2=[0,1]
,这向我表明
list\u 1+=[1]
没有修改
list\u 1
变量。”为什么这对你来说意味着什么?@BrenBarn我相信Jon的意思是
list_1+=[1]
没有导致
list_1
指向一个不同的列表,而
list_1=list_1+[1]
创建了一个新列表,并让
list_1
指向那个新列表。@Rob Watts是的,这正是我的意思。我想说的是,这是一个可读性和一致性的问题。如果
list_1
是一个int,
+=
将重新分配,因此必须使用
global
+=
对所有类型的全局性都有相同的影响这是有道理的。我,OP询问了Python 3.x,但您的第一个链接是Python 2.x文档。@njzk2如果我正确理解了您的观点,那么对于不可变类型,无论您使用的是
+=
还是普通的
=
,因为无论如何,它只会更新一个变量,而所有其他引用都不会受到影响。因此,
+=
将根据对象的类型产生不同的效果。@RobWatts更新了链接,除了
非本地部分之外,它们基本上是相同的。@aश威尼च豪德利:是的。如果你看
a=3;身份证(a);a+=1;id(a)
vs
lst=[];id(lst);lst+=[0];id(lst)
,您将看到
+=
重新分配不可变类型(显然必须),但不重新分配列表。