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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 11:03:11