Python中直接赋值与切片复制为何返回不同布尔值且ID不同?
这个问题其实戳中了Python里对象引用和拷贝的核心逻辑,我给你一步步讲明白:
1. 直接赋值 b = a:俩变量共享同一个“本体”
当你写b = a的时候,Python根本没给你造新列表——它只是给原来的列表a多贴了个叫b的标签而已。也就是说,a和b指向的是内存里同一个列表对象。
is运算符的作用就是判断两个变量是不是指向同一个对象,所以这时候a is b肯定返回True,连它们的内存ID都完全一样:
>>> a = [[1,2],[3,4]] >>> b = a >>> a is b True >>> id(a) == id(b) True
2. 切片赋值 b = a[:]:造了个新的“外壳”(浅拷贝)
a[:]这个操作会生成一个新的列表对象,这个新列表里装的元素和原列表a的元素是一样的,但新列表本身是独立的新对象。所以b指向的是这个新家伙,和a指向的原列表不是同一个,自然a is b返回False,ID也不一样:
>>> b = a[:] >>> a is b False >>> id(b) 93006904 >>> id(a) 92963864
不过要提一句,这只是浅拷贝——如果原列表里的元素是可变对象(比如例子里的子列表),那新列表里的元素还是指向原来的子对象。比如你改a里的子列表元素,b里的也会跟着变:
>>> a[0][0] = 99 >>> print(b) [[99, 2], [3, 4]]
一句话总结
直接赋值是给同一个对象加别名,切片赋值是创建一个新的外层列表(但内部元素还是共享的),这就是两种方式导致is判断结果不同的根本原因。
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

