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

Python列表赋值行为疑问:为何最后一种场景中b的值变为[1]?

为什么最后一种场景中b的值会变为[1]?

要搞懂这个问题,核心得区分Python里列表的引用赋值和切片拷贝的本质,以及“重新绑定变量”和“修改对象内容”的区别:

关键概念

  • b = a:这是引用赋值——a和b指向同一个列表对象,相当于给同一个列表起了两个名字,修改这个列表的内容,两个变量都会反映出变化。
  • b = a[:]:这是浅拷贝——创建一个和原列表内容完全相同的新列表对象,a和b指向不同的对象,修改其中一个的内容,另一个不受影响。

逐个拆解四个场景

场景1

a = [0]
b = a[:]  # 创建新列表,b指向这个新列表(内容[0])
a = [1]   # 把a重新绑定到一个全新的列表[1],和b的列表没关系
print(a,b)  # 输出 [1] [0]

场景2

a = [0]
b = a[:]  # 新列表,b独立指向它
a[0] = 1  # 修改a指向的原列表的元素,但b的列表是另一个,所以b不变
print(a,b)  # 输出 [1] [0]

场景3

a = [0]
b = a     # b和a指向同一个列表[0]
a = [1]   # a重新绑定到新列表[1],但b还指着原来的[0]
print(a,b)  # 输出 [1] [0]

场景4(你疑惑的重点)

a = [0]
b = a     # b和a指向同一个列表对象
a[0] = 1  # 直接修改这个共同指向的列表的内部元素,不是给a换个新列表
print(a,b)  # 输出 [1] [1]

一句话总结

  • 当你写a = [1],是给a换了个新对象,不影响之前和a绑定过的其他变量;
  • 当你写a[0] = 1,是直接修改a当前指向的对象的内容,所有指向这个对象的变量都会同步看到变化。

内容的提问来源于stack exchange,提问作者OhMoh24

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 15:39:19