Python 为什么要与“比较”;是";假设从一个列表复制到另一个列表的值是同一个对象?

Python 为什么要与“比较”;是";假设从一个列表复制到另一个列表的值是同一个对象?,python,Python,上述代码的输出将为False-True。 我知道第一个是假的,因为两个列表有不同的ID,但是为什么第二个是真的?他们不是也有不同的ID吗 No那些L[0]和M[0]是两个整数,它们的ID基于其(不可变)值和首次使用。在程序的生命周期内,数字1不会有两个不同的ID 这只会发生在Python兑现的小整数上。不那些L[0]和M[0]是两个基于其(不可变)值和首次使用而具有ID的整数。在程序的生命周期内,数字1不会有两个不同的ID 只有Python兑现的小整数才会发生这种情况。如果两个变量指向同一个对象

上述代码的输出将为False-True。
我知道第一个是假的,因为两个列表有不同的ID,但是为什么第二个是真的?他们不是也有不同的ID吗

No那些
L[0]
M[0]
是两个整数,它们的ID基于其(不可变)值和首次使用。在程序的生命周期内,数字1不会有两个不同的ID


这只会发生在Python兑现的小整数上。

不那些
L[0]
M[0]
是两个基于其(不可变)值和首次使用而具有ID的整数。在程序的生命周期内,数字1不会有两个不同的ID


只有Python兑现的小整数才会发生这种情况。

如果两个变量指向同一个对象,则返回True。
M是对L的引用。但M[0]和L[0]指向相同的值。

如果两个变量指向同一对象,is将返回True。
M是对L的引用。但是M[0]和L[0]指向相同的值。

这对于小整数是正确的,但是对于可变值也是正确的,因为复制列表会复制引用——新列表中的每个元素都指向与旧列表中的每个元素相同的标识。需要注意的是,对于可变值,它具有您可能不希望的副作用

L = [1, 2, 3]
M = L[:]
print(M is L, M[0] is L[0])

这就是允许
copy.deepcopy()
(生成没有共享元素的新列表)存在的原因。

对于小整数也是如此,但对于可变值也是如此,因为复制列表会复制引用——新列表的每个元素都指向与旧列表的每个元素相同的标识。需要注意的是,对于可变值,它具有您可能不希望的副作用

L = [1, 2, 3]
M = L[:]
print(M is L, M[0] is L[0])

这就是为什么存在允许复制.deepcopy()(以生成没有共享元素的新列表)的原因。

如果两个变量指向同一个对象,则
is
将返回
True
。对于(小)整数,ID主要取决于它们的值和在程序中的首次使用,因为整数是不可变的(在Python中)。对不可变对象值的任何更改都将导致不同的ID,因此在本例中,整数
1
在程序运行期间将只有一个ID。

如果两个变量指向同一对象,则
is
将返回
True
。对于(小)整数,ID主要取决于它们的值和在程序中的首次使用,因为整数是不可变的(在Python中)。对不可变对象的值的任何更改都将导致不同的ID,因此在这种情况下,整数
1
,在程序运行期间将只有一个ID。

否。为什么它们应该有不同的ID?这将是真的,因为如果对象是不可变的,两个列表的第一个索引将是相同的(在Python中,整数是不可变的),它们不能被修改——对值的任何更改都将导致一个新的、不同的id。因此,通过向相同的标识创建一个新的引用点来复制它们总是安全的生成一个副本是不正确的,它会生成一个切片。而且它肯定不会复制其中的值。否。为什么它们应该有不同的ID?这将是正确的,因为两个列表的第一个索引将是相同的,如果一个对象是不可变的(在Python中整数是不可变的),它们不能被就地修改——对值的任何更改都将导致一个新的不同id。因此,通过对同一标识创建一个新的引用点来复制它们总是安全的。即使认为
[:]
生成副本是不正确的,它也会生成一个片段。而且它肯定不会复制其中的值。