python中的list.append(另一个列表)与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]] 这是我最初的解决方案: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
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[:]
更清晰。不过,这只是美学;使用“切片”操作符创建副本效果良好。