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
ingli
作为一个整体可能是有意义的;你可以先做一次,之后不必担心破坏性突变。以下方法可以解决你的问题:
def li_of_li_test (li):
l = li[:]
l = list(li[0])
l.append(0)
return li
是否不将0
附加到列表中?我不明白你的问题是什么。你故意用l=li[0]在第一个子列表中添加a0
;l、 追加(0)
,那么当您在其中得到一个新的0
时,您会感到惊讶吗?为什么希望值保持不变?这里的问题是对l=li[0]
的误解,而不是参数传递;毕竟,打印的值是函数返回的值,即使使用传递值语义,也不会改变。