list.append(another_list)vs python中的list.append(another_list [:])?

时间:2015-12-06 12:34:16

标签: python list append

这是我必须要做的一个问题:

我们将实现一个非常有用的功能,称为组。

组获取事物列表并返回组列表,其中每个组由列表中所有相等的连续元素组成。

例如:

组([1,1,1,2,3,1,1])== [[1,1,1],[2],[3],[1,1]]

组([1,2,1,2,3,3])== [[1],[2],[1],[2],[3,3]]

这是我最初的解决方案:

def group(int_list):    

group_list = []
current_list = []

for i in range(len(int_list)):
    if int_list[i] not in current_list:
        if len(current_list) != 0:
            group_list.append(current_list)
        del current_list[:]
        current_list.append(int_list[i])
    else:
        current_list.append(int_list[i])    

group_list.append(current_list)

return group_list

我得到的输出:

[[1, 1], [1, 1], [1, 1], [1, 1]]

在花了30分钟试图找出问题之后,我将第9行从group_list.append(current_list)更改为group_list.append(current_list[:]),令人惊讶的是魔术起作用了。我得到了正确的输出:

[[1, 1, 1], [2], [3], [1, 1]]

所以我想我的问题是current_listcurrent_list[:]之间有什么区别?

2 个答案:

答案 0 :(得分:2)

current_list[:]current_list浅层副本; 。e.g,:

在您的函数中,您正在构建current_list引用的内容(当前组的列表)。完成后,将此内容添加到group_list,然后通过删除其所有内容(del current_list[:])来重置该内容。我们必须记住,Python中的所有内容都是引用,因此,使用您的第一个代码,group_list包含对相同对象的多个引用(这就是为什么您的输出看起来像{{1} })。当您删除[[1, 1], [1, 1], [1, 1], [1, 1]]的内容并稍后添加新元素时,您也会对current_list的每个元素执行此操作。

使用您发现的group_list语法,创建current_list[:]的副本并将其添加到current_list;删除group_list的内容后,以后不会修改此副本。

答案 1 :(得分:1)

Basicaly的主要区别在于current_list是对列表的引用,而current_list [:]是一个包含列表元素的新数组。因此,使用第一个,当您更改current_list时,group_list也会更改。另一种方法是,如果更改current_list,则不会修改group_list。