
Python 中变量赋值不复制对象,而是创建对同一对象的引用;对可变对象(如列表)的原地修改会反映在所有引用上,这是语言设计特性而非 Bug。可通过 copy() 等方法实现独立副本。
python 中变量赋值不复制对象,而是创建对同一对象的引用;对可变对象(如列表)的原地修改会反映在所有引用上,这是语言设计特性而非 bug。可通过 `copy()` 等方法实现独立副本。
在 Python 中,b = a 并非“复制列表”,而是让变量 b 指向与 a 相同的内存地址——二者共享同一个列表对象。因此,当执行 a[0] = 1 时,实际是在原列表上做就地修改(in-place mutation),b 自然也会看到 [1, 0]。这不是 bug,而是 Python 对可变对象(如 list、dict、set)引用语义的明确设计。
✅ 正确做法:创建独立副本
最常用且推荐的方式是使用 .copy() 方法(浅拷贝):
a = [0, 0] b = a.copy() # 创建新列表,内容相同但内存独立 a[0] = 1 print(b) # 输出: [0, 0]
其他等效方式包括:
-
b = a[:](切片语法,仅适用于序列) b = list(a)-
import copy; b = copy.copy(a)(显式调用浅拷贝)
⚠️ 注意事项:
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
-
.copy()是浅拷贝:若列表内含嵌套可变对象(如a = [[1], 2]),修改a[0][0]仍会影响b[0][0]。此时需用copy.deepcopy(a)。 - 不要误用
b = a后再b = [...]——这只会让b指向新对象,不影响a,但无法解决原问题中“修改a影响b”的需求。 - 不可变对象(如
int、str、tuple)不存在此现象,因为它们不支持就地修改,赋值a = 5; b = a; a += 1不会影响b。
总结:理解 Python 的“对象引用模型”是写出可靠代码的关键。默认赋值即共享引用;需要隔离状态时,务必显式拷贝——优先用 .copy(),复杂嵌套时升级为 deepcopy。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










