Python2.7在列表的列表中追加

Python2.7在列表的列表中追加,python,Python,我试图处理一个列表,并希望获取列表中的一个元素,处理它,然后将其附加到另一个列表中 我发现.append()有我意想不到的行为: def li_of_li_test (li): l = li[0] l.append(0) return li 函数应该只返回li,而不是 print li_of_li_test ([[1,2,3],[4,5]]) 返回: [[1, 2, 3, 0], [4, 5]] 我该怎么做才能让它回来 [[1,2,3],[4,5]] 在pytho

我试图处理一个列表,并希望获取列表中的一个元素,处理它,然后将其附加到另一个列表中

我发现
.append()
有我意想不到的行为:

def li_of_li_test (li):
    l = li[0]
    l.append(0)
    return li
函数应该只返回
li
,而不是

print li_of_li_test ([[1,2,3],[4,5]])
返回:

[[1, 2, 3, 0], [4, 5]]
我该怎么做才能让它回来

[[1,2,3],[4,5]]

在python中,值是通过引用传递的。列表是一个可变结构

from copy import deepcopy

def li_of_li_test (li):
    l = deepcopy(li[0])
    l.append(0)
    return li

print li_of_li_test ([[1,2,3],[4,5]])

[[1, 2, 3], [4, 5]]

我在实际代码中假设:

def li_of_li_test (li):
    l = li[0]
    l.append(0)
    return li
将尝试不修改
li
参数,但在
li
中获取第一个子
列表
,并将修改后的副本放入其他
列表
。你以为
l=li[0]
会制作该子
列表的新副本来处理,但它不是这样做的;它只是使
l
再次引用存储在
li[0]
中的同一
列表。如果要复制
列表
,可以通过以下方法实现简单的浅层复制:

l = li[0][:]  # [:] is a complete slice of the sublist, a shallow copy
或者,您可以通过更深入的工作来复制
列表
的组件,而不仅仅是
列表
结构,包括:

import copy

l = copy.deepcopy(li[0])
无论哪种方式,简单的
append
s和类似的
l
都不会再影响
li


如果您需要对不同的子列表进行许多突变,
deepcopy
ing
li
作为一个整体可能是有意义的;你可以先做一次,之后不必担心破坏性突变。

以下方法可以解决你的问题:

def li_of_li_test (li):
    l = li[:]
    l = list(li[0])
    l.append(0)
    return li

是否不将
0
附加到列表中?我不明白你的问题是什么。你故意用
l=li[0]在第一个子
列表中添加
a
0
;l、 追加(0)
,那么当您在其中得到一个新的
0
时,您会感到惊讶吗?为什么希望值保持不变?这里的问题是对
l=li[0]
的误解,而不是参数传递;毕竟,打印的值是函数返回的值,即使使用传递值语义,也不会改变。