Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python-按值传递或按引用传递_Python_Reference - Fatal编程技术网

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)