Python 如何让我的班级';调用时复制的对象(例如迭代时)

Python 如何让我的班级';调用时复制的对象(例如迭代时),python,immutability,Python,Immutability,我需要我的类在引用时创建对象的新副本 例如: obj1 = MyClass(1,2) obj2 = obj1 obj2.1st_att = 5 >>> print obj1 (5,2) 我希望obj1保持与obj2的未链接状态,在这种情况下,您应该反对 from copy import copy obj1 = MyClass(1,2) obj2 = copy(obj1) obj2.1st_att = 5 如果您的类很复杂并且有很多引用,那么可以使用deepcopy。Pyt

我需要我的类在引用时创建对象的新副本

例如:

obj1 = MyClass(1,2)
obj2 = obj1
obj2.1st_att = 5

>>> print obj1
(5,2)
我希望obj1保持与obj2的未链接状态,在这种情况下,您应该反对

from copy import copy
obj1 = MyClass(1,2)
obj2 = copy(obj1)
obj2.1st_att = 5

如果您的类很复杂并且有很多引用,那么可以使用deepcopy。

Python不会在每次将int或float赋给不同的变量时都复制它们。问题是它们是不可变的;对于
int
,你无法改变它,所以不管你给它分配了多少变量,你都不会得到任何令人惊讶的行为

使用
obj2.1st_att=5
,可以显式修改对象的属性。对于
int
,没有类似的操作。预期此操作会修改该对象,并且此更改对持有该对象引用的任何其他人都可见


您不应该试图以任何方式解决该行为,因为这将打破许多期望,并导致错误或令人惊讶的行为本身。制作对象的副本是您需要采取的明确行动,这一点很好。习惯它。

您是否在询问如何在每次引用对象时自动复制该对象?这根本不是Float或Int的工作原理。duplicate of duplicate:@ScottHunter那么它们是如何工作的呢?我希望我的对象基本上是不可变的,这样在迭代或引用时,对新对象所做的任何更改都不会链接到original@Rocobop你到底想要什么?请写下您的输入、您最终尝试过的代码以及预期的输出。@ScottHunter太长了,无法发布,但这就是它的jist:我从我的类中创建了一个对象列表,并对该列表进行了迭代,并将每个项添加到字典中。键是我的类的第一个属性。现在-字典中的项目链接到列表中的项目。这不是我想要的,我需要把它们拆开。在我发布的代码中,演示了相同的行为,我希望对此进行更改。我试图避免使用copy,但我希望在我的class@Rocobop我相信这个解决方案就是你正在寻找的。有没有链接?我知道。。。你误解了我的意思-我希望我的类的每个实例都是一个副本。或者本质上,我希望我的类的对象是不可变的,但我找到的唯一答案是如何阻止对属性所做的更改,这并不能解决我的问题。那么,您是否希望能够分配到
obj2.1st_att=5
?这是对象应该支持的操作吗?或者,当有人试图将任何内容分配给您的对象时,您是否只想引发一个错误?这是一个不同于自动复制的讨论。我只是希望它在引用对象时自动复制一个新的副本,我不想阻止对属性的更改,所以你不想要不可变的对象,好的。然后再读一遍我的答案,你也不希望有自动复制行为。不,你没有。你可能认为你有,但你没有。努恩。认真地