You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:22:09