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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 14:25:20