Python2.7附加在列表列表中

时间:2016-01-09 05:45:53

标签: 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]]

3 个答案:

答案 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的新副本,但这不是它的作用;它只是llist中存储的同一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