python中的list.append(另一个列表)与list.append(另一个列表[:])?

python中的list.append(另一个列表)与list.append(另一个列表[:])?,python,list,append,Python,List,Append,我必须解决一个问题: 我们将实现一个非常有用的函数,名为group group获取一个事物列表并返回一个group列表,其中每个group由列表中所有相等的连续元素组成 例如: 组([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

我必须解决一个问题:

我们将实现一个非常有用的函数,名为group

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

例如:

组([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行从
组列表.append(当前列表)
更改为
组列表.append(当前列表[:])
,神奇的效果令人惊讶。我得到了正确的输出:

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

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

current_list[:]
current_list
的一个浅显副本;e、 g.,:

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


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

current_list[:]
current_list
的浅拷贝;e、 g.,:

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


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

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

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

另一种修复原始代码的方法是将
del current_list[:]
更改为
current_list=[]
,这样下次追加
current_list时,它将是一个不同的列表(即不需要进行浅层复制)。另一种修复原始代码的方法是更改
del current_list[:]
current_list=[]
,这样下次追加
current_list
时,它将是一个不同的列表(即无需进行浅层复制)。那么这是正确的方法吗?仅仅通过添加[:]@BobbyBrown,似乎大家的共识是,就代码风格而言,通过编写
list(current\u list)
来创建浅拷贝比
current\u list[:]
更清晰。不过,这只是美学;使用slice操作符创建副本效果很好。那么这是正确的方法吗?仅仅通过添加[:]@BobbyBrown,似乎大家的共识是,就代码风格而言,通过编写
list(current\u list)
来创建浅拷贝比
current\u list[:]
更清晰。不过,这只是美学;使用“切片”操作符创建副本效果良好。