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
相关产品推荐
相关产品推荐

