
在 Python 中,直接用 = 赋值列表(如 req2 = req1)并不会创建新列表,而是让两个变量指向同一内存对象;因此对任一变量调用 append() 等就地修改方法,都会影响另一个变量。要真正独立复制列表,需使用 .copy() 或其他拷贝方式。
在 python 中,直接用 `=` 赋值列表(如 `req2 = req1`)并不会创建新列表,而是让两个变量指向同一内存对象;因此对任一变量调用 `append()` 等就地修改方法,都会影响另一个变量。要真正独立复制列表,需使用 `.copy()` 或其他拷贝方式。
这是 Python 初学者常遇到的经典“引用陷阱”。问题代码中:
req1 = [23, 24, 25] req2 = req1 # ❌ 不是复制,而是创建新引用 req2.append(26) op = [[], []] op[0] = req2 op[1] = req1 print(op) # 输出:[[23, 24, 25, 26], [23, 24, 25, 26]]
表面上看 req2 = req1 像是“把值传过去”,但实际上它只是将 req1 所指向的列表对象的内存地址赋给了 req2。此时 req1 和 req2 是同一个列表的两个名字,修改其一即等于修改整体。
✅ 正确做法:使用浅拷贝(shallow copy)创建独立副本:
调用 Cutout.Pro 视觉处理 API 进行背景移除、人像抠图和照片增强,支持文件上传与图片 URL 输入。
req1 = [23, 24, 25] req2 = req1.copy() # ✅ 创建新列表,内容相同但内存独立 # 或等价写法: # req2 = req1[:] # 切片拷贝 # req2 = list(req1) # 构造新列表 # req2 = [*req1] # 解包(Python 3.5+) req2.append(26) op = [req2, req1] print(op) # 输出:[[23, 24, 25, 26], [23, 24, 25]] —— 符合预期!
⚠️ 注意事项:
-
.copy()是浅拷贝,适用于仅含不可变元素(如数字、字符串)的一维列表;若列表嵌套了可变对象(如子列表、字典),需改用copy.deepcopy()。 -
req2 = req1和req2 = req1.copy()的本质区别在于:前者是对象引用绑定,后者是对象复制。可通过id()函数验证:
print(id(req1) == id(req2)) # False(使用 .copy() 后) print(req1 is req2) # False
? 小结:Python 中“赋值不等于复制”。牢记——
? = → 引用共享(aliasing)
? .copy() / [:] / list() → 浅拷贝(独立副本)
? copy.deepcopy() → 深拷贝(彻底隔离嵌套结构)
掌握这一原理,能有效避免数据意外污染,写出更健壮、可预测的代码。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










