Python中是否有一条语句,只有当两个复合列表的所有项都具有不同的id';s

Python中是否有一条语句,只有当两个复合列表的所有项都具有不同的id';s,python,list,Python,List,我最近发现某些作业,例如: list2 = list1*1 list2 = list1[:] list2 = copy.copy(list1) (need to import copy) 在复合列表(例如列表列表)上使用时,生成的列表2的id与列表1不同,但组件的id相同。因此,list2组件中的后续更改也将更改list1的相应组件。无论某些列表组件是否具有相同的id,list2islist1语句将解析为False 我的问题: 是否有类似于notsame的命令,仅当list1和l

我最近发现某些作业,例如:

list2 = list1*1  
list2 = list1[:]  
list2 = copy.copy(list1)  (need to import copy)  
在复合列表(例如列表列表)上使用时,生成的列表2的id与列表1不同,但组件的id相同。因此,list2组件中的后续更改也将更改list1的相应组件。无论某些列表组件是否具有相同的id,
list2islist1
语句将解析为
False

我的问题:

是否有类似于
notsame
的命令,仅当list1和list2及其所有组件具有不同的ID时才会解析
True

否,您必须编写一个函数来按ID比较所有项,但请注意,如果项是可变的,并且它们的ID为否,则只有当它们“不相同”时才重要“ismutable()”函数

如果希望列表副本同时复制子列表和其他可变项,请使用:

import copy
list1 = copy.deepcopy(list2)
请注意,假设的
notsame
函数即使与deepcopy一起也无法工作,因为不可变项不需要具有唯一的ID。Python可以通过重新使用对象来优化不可变项,因为它无法更改

下面是一个例子:

import copy

list1 = [1,2,[3,4,5],6,7,[8,9,10]]

list2 = list1.copy()
list3 = copy.deepcopy(list1)

def ids(x):
    return ' '.join([f'{id(i):08x}' for i in x])

print(ids(list1))
print(ids(list2))
print(ids(list3))
输出:

7ffdff4006a0 7ffdff4006c0 22da8898200 7ffdff400740 7ffdff400760 22da8898a00
7ffdff4006a0 7ffdff4006c0 22da8898200 7ffdff400740 7ffdff400760 22da8898a00
7ffdff4006a0 7ffdff4006c0 22da88aea80 7ffdff400740 7ffdff400760 22da88ae980

请注意,浅拷贝(第2行)ID都是相同的。只有第3项和第6项在
list3
(第3行)中有一个新ID。整数对象(无论如何在CPython的实现中)不会更改其ID。只有可变列表对象会更改。

可以编写一个简单的函数来手动执行检查:

def all_unique(list1, list2):
    return id(list1) != id(list2) and all(id(x) != id(y) for x, y in zip(list1, list2))
据我所知,没有任何内置软件可以用于此明确目的


这似乎是一个奇怪的要求。只需清除“某些赋值”返回的元素具有相同的ID:所有显示的方法(序列乘法、切片和
copy.copy
)它们都生成浅层副本。它们所做的只是复制外部结构,同时将对底层对象的引用复制到新结构中。如果要确保副本中的所有对象都是唯一的(或者至少在重要的情况下是唯一的),改为使用
copy.deepcopy
。它将递归地遍历支持结构并复制所有对象。

谢谢,这回答了我的问题。我是一个相对初学者,不熟悉
all
命令