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

如何优雅实现函数所有参数的深拷贝,避免原数据被修改?

实现批量深拷贝函数参数的优雅方式

嘿,这个想法真不错——批量处理参数拷贝确实能让代码清爽不少!不过直接操作locals()可能会踩坑,因为Python函数内的locals()返回的是局部变量的快照,修改这个字典并不会同步到实际的局部变量里。咱们来实现你想要的newdeepcopy函数,顺便还能给你推荐个更Pythonic的装饰器方案。

方法一:实现你想要的newdeepcopy函数

我们可以借助标准库的inspect模块来获取当前函数的参数列表,再通过调用栈帧来修改局部变量:

import copy
import inspect

def newdeepcopy():
    # 获取调用newdeepcopy的函数的栈帧
    caller_frame = inspect.currentframe().f_back
    # 提取当前函数的所有参数名
    param_names = inspect.signature(caller_frame.f_code).parameters.keys()
    
    # 遍历每个参数,执行深拷贝并更新局部变量
    for name in param_names:
        if name in caller_frame.f_locals:
            caller_frame.f_locals[name] = copy.deepcopy(caller_frame.f_locals[name])
    
    # 手动删除帧引用,避免内存泄漏
    del caller_frame

用法示例

def f(a1, a2):
    newdeepcopy()
    # 现在修改a1/a2完全不会影响原列表
    a1.append(3)
    a2.append("新增元素")
    print("修改后的参数:", a1, a2)

original_list1 = [1, 2]
original_list2 = ["a", "b"]
f(original_list1, original_list2)
print("原列表未被修改:", original_list1, original_list2)

方法二:更Pythonic的装饰器方案

如果不想在每个函数里都写newdeepcopy()调用,装饰器会是更优雅的选择——它能自动帮你处理所有参数的深拷贝:

import copy
import inspect

def deepcopy_args(func):
    def wrapper(*args, **kwargs):
        # 把传入的参数和函数签名绑定,处理默认参数
        bound_params = inspect.signature(func).bind(*args, **kwargs)
        bound_params.apply_defaults()
        # 对每个参数执行深拷贝
        copied_params = {k: copy.deepcopy(v) for k, v in bound_params.arguments.items()}
        # 用拷贝后的参数调用原函数
        return func(**copied_params)
    return wrapper

# 直接装饰函数即可
@deepcopy_args
def f(a1, a2):
    a1.append(3)
    a2.append("新增元素")
    print("修改后的参数:", a1, a2)

original_list1 = [1, 2]
original_list2 = ["a", "b"]
f(original_list1, original_list2)
print("原列表未被修改:", original_list1, original_list2)

注意事项

  • 两种方法都依赖Python标准库,无需额外安装包。
  • 栈帧操作要记得删除引用,避免内存泄漏(方法一里的del caller_frame就是干这个的)。
  • 如果函数有可变默认参数(比如def f(a1=[], a2={})),这种写法依然能处理,但默认参数本身的Python特性坑还是要注意。
  • 装饰器方案更适合多个函数需要批量拷贝参数的场景,代码复用性更强。

内容的提问来源于stack exchange,提问作者user50224

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:06:35