Python中局部变量传入子例程未收返回值却莫名变更的问题
问题分析与解决方案:局部变量意外变更的深层原因
我一眼就看穿问题了——你踩中了Python里列表浅拷贝的经典陷阱!
先给你拆解清楚:你在Menu()里用old = stock_list[:]创建了原列表的拷贝,但这种切片方式做的是浅拷贝——它只会复制列表的外层容器,而列表里的子列表(比如["DVI cable"]这类元素)仍然是和原列表共享的引用。当Save()函数修改传入的list_of_stock里的子列表内容时,实际上是在操作和old共用的同一个子列表对象,所以old看起来就“莫名其妙”地变了。
从你的输出也能实锤这一点:old的第一个子列表从["DVI cable"]变成了包含代码对象的列表,说明Save()函数肯定在修改list_of_stock[0]这个子列表的内部元素(比如替换它的内容)。
两种解决方案任你选
方案1:用深拷贝彻底隔离所有层级
如果你的列表存在多层嵌套(比如列表里套列表),直接用copy模块的deepcopy就能完全复制所有层级的对象,彻底切断和原列表的引用关联:
import copy def Menu(): ##Menu actions old = copy.deepcopy(stock_list) print(old, "before") Save(stock_list[:]) print(old, "after")
方案2:手动拷贝子元素(适合明确嵌套层级的场景)
如果你确定列表只有一层嵌套,也可以用列表推导式逐个拷贝子元素,实现“半深拷贝”:
def Menu(): ##Menu actions old = [sublist[:] for sublist in stock_list] print(old, "before") Save(stock_list[:]) print(old, "after")
另外提醒一句:你代码里的Save(stock_list[:])其实也是浅拷贝,如果Save()修改的是子列表内容,原stock_list也会被影响——如果这不是你预期的行为,那Save()函数内部也应该对传入的参数做深拷贝处理哦。
内容的提问来源于stack exchange,提问作者HElpME
相关产品推荐
相关产品推荐

