我正在尝试使用列表列表,并希望获取列表列表中的一个元素,使用它,然后将其附加到另一个列表。
我发现.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]]
答案 0 :(得分:0)
在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]]
答案 1 :(得分:0)
我在实际代码中假设:
def li_of_li_test (li):
l = li[0]
l.append(0)
return li
会尝试保持li
参数不被修改,但会取list
中的第一个子li
,并将修改过的副本放在其他list
中。您认为l = li[0]
会制作该子版本list
的新副本,但这不是它的作用;它只是l
对list
中存储的同一li[0]
的另一个引用。如果要复制list
,可以使用以下方法实现简单的浅拷贝:
l = li[0][:] # [:] is a complete slice of the sublist, a shallow copy
或者您可以通过更多工作深度复制list
的组件,而不仅仅是list
结构:
import copy
l = copy.deepcopy(li[0])
无论哪种方式,append
之类的简单l
等等都不会再影响li
。
如果您需要对不同的子列表进行多次突变,deepcopy
li
整体可能有意义;你事先做过一次,而不必担心在此之后破坏性地改变li
。
答案 2 :(得分:0)
以下内容可以解决您的问题:
def li_of_li_test (li):
l = li[:]
l = list(li[0])
l.append(0)
return li