Python嵌套列表代码逻辑解析:为何原列表la会被意外修改?
为什么修改lb会改变原列表la?
先看你的代码运行逻辑:
la = [1,[2,[3,[4]]]] lb = [la[1], la[1][1]] print(la) # 输出 [1, [2, [3, [4]]]] lb[0][1]=9 print(la) # 输出 [1, [2, 9]]
核心原因:Python可变对象的引用传递
Python里的列表属于可变对象,当你把列表元素赋值给新变量时,并没有复制元素本身,只是把元素在内存中的引用(地址)传给了新变量。
拆解你的代码步骤:
la[1]指向的是列表[2, [3, [4]]],你把这个引用赋值给lb[0],所以lb[0]和la[1]是同一个列表对象。- 同理,
la[1][1]指向的是列表[3, [4]],这个引用被赋值给lb[1],所以lb[1]和la[1][1]也是同一个对象。
当执行lb[0][1] = 9时,本质是通过lb[0]这个引用找到它指向的列表(也就是la[1]),修改该列表索引1位置的值。既然la[1]和lb[0]是同一个对象,la自然会跟着变化。
和深浅拷贝的关系
你的场景还没涉及“拷贝”操作,只是直接传递了原对象的引用,这里简单区分三种情况:
- 直接引用:像你代码里的
lb = [la[1], la[1][1]],完全复用原对象引用,修改任何一方都会影响另一方。 - 浅拷贝:比如
lb = la.copy()或lb = la[:],会创建新的外层列表,但内部子元素还是原列表的引用。修改外层列表元素(如lb[1] = 10)不影响la,但修改子列表内容(如lb[1][1] =9)仍会影响la。 - 深拷贝:用
copy.deepcopy(),会递归复制所有层级的对象,创建完全独立的副本。修改深拷贝后的列表,原列表不受任何影响。
让lb修改不影响la的方法
如果想让lb成为独立列表,修改它不影响la,可以用深拷贝:
import copy la = [1,[2,[3,[4]]]] lb = copy.deepcopy([la[1], la[1][1]]) lb[0][1] =9 print(la) # 输出 [1, [2, [3, [4]]]],原列表保持不变
内容的提问来源于stack exchange,提问作者moonmoon
相关产品推荐
相关产品推荐

