python-按值传递或按引用传递
我有一个属性为列表的对象。例如:python-按值传递或按引用传递,python,reference,Python,Reference,我有一个属性为列表的对象。例如: obj.a = [3, 4, 5] 我希望获得以下行为(但我无法使用magics/etc找到解决方案): 当然,我可以简单地使用copy.deepcopy: l = copy.deepcopy(obj.a) 但出于几个原因,我想以某种方式使这一步骤自动/为我的用户隐藏它 [编辑] 使用getattribute并返回副本当然不起作用: import copy class Test: def __init__(self): self.
obj.a = [3, 4, 5]
我希望获得以下行为(但我无法使用magics/etc找到解决方案):
当然,我可以简单地使用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))
感谢您的帮助
谢谢你,
托马斯不可能进行赋值
l=obj.a
复制obj.a
。正如deceze在一篇评论中所说,您可以创建一个属性,该属性在每次访问时返回该值的副本,但这将在每次访问时创建一个副本,而不仅仅是在将其分配给l
时。这将是低效的,而且可能不是你想要的行为
obj
或obj.a
无法区分这样的东西:
x = obj.a
这是:
obj.a[:2]
无论在访问obj.a时发生什么,这两种情况都会发生。您不能“向前看”以查看它是否将被分配给变量,而只是在特定情况下复制它。只需使用以下代码即可
l = list(obj.a)
这将允许您将列表复制到新列表中如果不将列表实际克隆到另一个列表中,这是不可能的,您必须根据需要使用copy()或deepcopy() 如果不在操作过程中显式复制列表(当您希望使用副本时)并在操作过程中保留列表(当您不希望使用副本时),则无法实现此操作。换句话说,从python的角度来看,从第一行到第二行的
obj.a
访问没有什么不同,因此没有魔法信号允许您在某些情况下隐藏复制操作,而不是在其他情况下隐藏复制操作。可能的复制可以覆盖obj.a
属性以始终返回列表的副本…但是,这将是相当昂贵的,并且打破了许多假设,在这些假设中,你确实期望不复制的正常行为。当你需要一份复印件时,请明确。好的,谢谢,这是我期待的答案。那就没有魔法信号了!您可能会发现这篇文章很有帮助:,它是由经验丰富的Ned Batchelder撰写的。谢谢您的回答。我猜我想要的行为在某些语言中接近于所谓的值类!
l = list(obj.a)