我有一个属性是列表的对象。例如:
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))
任何帮助表示赞赏!
揍你, 托马斯
答案 0 :(得分:1)
无法让作业l = obj.a
复制obj.a
。正如deceze在评论中所说的那样,你可以使a
属性在每次访问时返回值的副本,但是每次访问它时都会复制,而不仅仅是在分配时它到l
。那将是效率低下的,可能不是你想要的行为
obj
或obj.a
无法区分这样的内容:
x = obj.a
和此:
obj.a[:2]
无论您访问obj.a
时发生什么,都会在两种情况下发生。您无法“向前看”以查看是否将其分配给变量,只是为了在特定情况下复制它。
答案 1 :(得分:0)
只需使用以下代码......
l = list(obj.a)
这将允许您将列表复制到新列表
答案 2 :(得分:0)
如果没有将列表实际克隆到另一个列表,这是不可能的,您必须根据您的要求使用copy()或deepcopy()。