我有一个属性是一个列表的对象。例如:python - 按值或按引用传递
obj.a = [3, 4, 5]
我想获得以下行为(但我不能管理使用魔法的/ etc找到一个解决方案。):
l = obj.a
obj.a[0] = 2
print(l) --> [3, 4, 5]
print(obj.a) ---> [2, 4, 5]
当然,我可以简单地使用拷贝.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))
任何帮助表示赞赏!
Thnak你, 托马斯
如果您不想在操作过程中使用副本并在操作过程中将其留在操作过程中而没有在操作过程中明确复制列表,则无法执行此操作。换句话说,从python的角度来看,从第一行到第二行的'obj.a'访问没有什么不同,所以没有魔法信号可以让你隐藏某些情况下的复制操作,而不是其他情况。 – mgilson
[如何在Python中复制或复制列表?]可能重复(http://stackoverflow.com/questions/2612802/how-to-clone-or-copy-a-list-in-python) – deceze
你可能重写'obj.a'属性总是返回一个列表的副本...但是,这将是相当昂贵的,并打破了许多假设,你*期望*不*复制的正常行为。当你需要一份副本时,明确地说明它。 – deceze