深度复制所有函数参数

use*_*224 3 python copy function python-3.x

我有以下问题。我有一个函数,它将 2 个列表作为参数。为了不改变它们中的任何一个,我想使用该copy模块并创建deepcopy两者。

到目前为止,我只走到了这一步:

import copy 

def f(a1, a2):
    a1 = copy.deepcopy(a1)
    a2 = copy.deepcopy(a2)
    # Rest of function code below.
Run Code Online (Sandbox Code Playgroud)

我个人认为这段代码不好看。最好有这样的东西

import copy 

def f(a1, a2):
    newdeepcopy(locals())
    # Rest of function code below. The same code as above.
Run Code Online (Sandbox Code Playgroud)

该函数newdeepcopy应将局部变量作为参数,并仅在 f 的范围内重新定义变量 a1 和 a2。这可能吗?

Ste*_*uch 9

使用装饰器怎么样?

代码:

def deep_copy_params(to_call):
    def f(*args, **kwargs):
        return to_call(*(copy.deepcopy(x) for x in args),
                       **{k: copy.deepcopy(v) for k, v in kwargs.items()})
    return f
Run Code Online (Sandbox Code Playgroud)

测试代码:

import copy

@deep_copy_params
def test(a, b, c=0):
    print(a, b, c)
    a[1] = 3
    b[2] = 4
    c[3] = 5
    print(a, b, c)

aa = {1: 2}
bb = {2: 3}
cc = {3: 4}

test(aa, bb, cc)
print(aa, bb, cc)
Run Code Online (Sandbox Code Playgroud)

结果:

{1: 2} {2: 3} {3: 4}
{1: 3} {2: 4} {3: 5}
{1: 2} {2: 3} {3: 4}
Run Code Online (Sandbox Code Playgroud)