Python中函数内外对全局列表的修改
我最近刚接触Python(用的是3.3.3版本),有个关于列表的问题想请教一下。当我在一个函数里修改一个全局的列表变量时(请不要给我讲全局变量的坏处),通常情况下不需要在函数里用global这个关键词来声明这个列表,只要你使用的是列表的方法。特别是,如果你想用增强型加法(比如说用+=),就必须先用global关键词。让我感到奇怪的是,在函数外使用增强型加法时,明显没有修改列表变量(只是修改了列表的内容),所以我本以为在函数里也可以不使用global关键词。这里有两个例子让我感到困惑:
list_1 = []
def my_func():
list_1.append(0)
#list_1 += [0]
my_func()
print('list_1 =', list_1)
这个例子打印出list_1 = [0]
,正如我预期的那样,而注释掉的增强型加法操作则会报错,提示在赋值之前使用了局部变量。
这是一个我无法和前一个例子对上的例子:
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,但增强型加法似乎不算。为什么在函数里使用增强型加法时需要用到global关键词呢?感谢任何帮助我理解这个问题的人。
1 个回答
5
问题在于,当一个函数的内容被解析时,所有在正常赋值或增强赋值中使用的变量都会被视为局部变量。因此,当函数被调用时,Python 不会在全局范围内查找这些变量,这样就会引发错误。所以你需要用 global
来告诉 Python 去全局范围找这些变量。
另外一个选择是使用 list.extend()
来代替 +=
。
相关链接: