【问题标题】:Deepcopy all function arguments深拷贝所有函数参数
【发布时间】:2018-03-29 23:52:00
【问题描述】:

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

到目前为止,我只走了这么远:

import copy 

def f(a1, a2):
    a1 = copy.deepcopy(a1)
    a2 = copy.deepcopy(a2)
    # Rest of function code below.

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

import copy 

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

函数newdeepcopy 应该以locals 作为参数,并且只在f 的范围内重新定义变量a1 和a2。这可能吗?

【问题讨论】:

  • 好的,非常感谢。不幸的是,没有更好的选择,但我可以处理。
  • 你为什么想要这个?在我看来,这更像是一个 XY 问题。
  • @Kasramvd:代码的可重用性是,AFAIK,一个很好的实践。我只是不想一次又一次地编写本质上相同的代码行(a1 = copy.deepcopy(a1))。

标签: python python-3.x function copy


【解决方案1】:

使用装饰器怎么样?

代码:

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

测试代码:

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)

结果:

{1: 2} {2: 3} {3: 4}
{1: 3} {2: 4} {3: 5}
{1: 2} {2: 3} {3: 4}

【讨论】:

    猜你喜欢
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多