python - 按值或按引用传递

时间:2016-09-02 06:53:05

标签: python reference

我有一个属性是列表的对象。例如:

obj.a = [3, 4, 5]

我希望得到以下行为(但我无法使用魔法等找到解决方案):

l = obj.a
obj.a[0] = 2

print(l) --> [3, 4, 5]
print(obj.a) ---> [2, 4, 5]

当然我可以简单地使用copy.deepcopy:

l = copy.deepcopy(obj.a) 

但出于几个原因,我想以某种方式让这个步骤自动/隐藏它给我的用户。

[编辑] 使用 getattribute 并返回副本当然不会有效:

import copy
class Test:
    def __init__(self):
         self.a = []

    def __getattribute__(self, attr):
        if attr == 'a':
            return copy.deepcopy(super(Test, self).__getattribute__(attr))

任何帮助表示赞赏!

揍你, 托马斯

3 个答案:

答案 0 :(得分:1)

无法让作业l = obj.a复制obj.a。正如deceze在评论中所说的那样,你可以使a属性在每次访问时返回值的副本,但是每次访问它时都会复制,而不仅仅是在分配时它到l。那将是效率低下的,可能不是你想要的行为

objobj.a无法区分这样的内容:

x = obj.a

和此:

obj.a[:2]

无论您访问obj.a时发生什么,都会在两种情况下发生。您无法“向前看”以查看是否将其分配给变量,只是为了在特定情况下复制它。

答案 1 :(得分:0)

只需使用以下代码......

l = list(obj.a)

这将允许您将列表复制到新列表

答案 2 :(得分:0)

如果没有将列表实际克隆到另一个列表,这是不可能的,您必须根据您的要求使用copy()或deepcopy()。