奇怪的行为附加到列表内部函数

时间:2014-11-12 19:06:57

标签: python list append

def test(list2):
    list2.append(1)
    print len(list2)
    print len(LIST1)

LIST1 = [1]

while len(LIST1) < 9:
    test(LIST1)

请解释为什么'LIST1'的大小越来越大,如果我附加'list2',那么函数是否在本地函数内?最重要的是,我怎么能绕过这个呢?

如果我创建一个新变量,也会发生同样的情况:

def test(arg_list):
    list2 = arg_list
    list2.append(1)
    print len(list2)
    print len(LIST1)

LIST1 = [1]

while len(LIST1) < 9:
    test(LIST1)

1 个答案:

答案 0 :(得分:1)

不,传递给函数的参数是引用的,在第二个示例中,局部变量是对同一列表的另一个引用。参数传递和变量赋值创建列表的副本,仅引用同一对象。换句话说:一旦函数退出,你对函数内部引用的对象所做的任何事情(比如列表)反映在对象本身上 - 函数参数和对象&#34;外&#34;功能是一样的。

你怎么能绕过这个?好吧,如果它适合您的使用场景,您只需复制列表,然后将其作为参数传递,如下所示:

test(LIST1[:])

上面将创建一个新的,不同的列表(它是一个浅层副本,但是...用于执行深层复制使用copy.deepcopy),您可以在函数内部安全地修改,如列表&#34;外侧&#34;功能将保持不变。