这是我必须要做的一个问题:
我们将实现一个非常有用的功能,称为组。
组获取事物列表并返回组列表,其中每个组由列表中所有相等的连续元素组成。
例如:
组([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_list
和current_list[:]
之间有什么区别?
答案 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。