奇怪的是,两个对象相互指向,其中一个对象上的每一个变化都会在另一个对象上流动

2024-09-29 17:09:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了一个具有如下代码所示属性的类,然后我构建了一个electron对象,为了不重新定义整个对象,我做了positron = electron,然后更改了它的name属性。问题是这两个对象似乎“像C++一样”指向对方一个对象属性的任何更改都会跟随第二个对象属性的任何更改,因此如何将一个对象的独立副本独立复制到不同的内存空间中

守则:

class particule():
    def __init__(self,name,Mass,TotaleEnergy=None):
        super().__init__()
        self.name=name
        self.mass=Mass
        self.energy=(TotaleEnergy if TotaleEnergy!=None else self.mass)


electron=particule("e-",0.511)
positron=electron ; electron.name="e+"
print(positron.name , electron.name)#I get e+,e+

Tags: 对象代码nameselfnone属性定义init
3条回答

您可以使用复制模块中的deepcopy,该模块将创建一个与电子相同的新对象,并使用不同的id存储在正电子中

from copy import deepcopy
positron=deepcopy(electron)

因为当你做正电子=电子的时候,它创建了一个物体电子的相同副本,并且它指向内存中与另一个物体相同的位置,所以如果你改变其中一个物体的属性,它将反映另一个物体

您所做的被称为浅拷贝,只是Python的工作方式Here is a link with documentation/explanation.以下是该网站的定义

A shallow copy means constructing a new collection object and then populating it with references to the child objects found in the original. In essence, a shallow copy is only one level deep. The copying process does not recurse and therefore won’t create copies of the child objects themselves.

A deep copy makes the copying process recursive. It means first constructing a new collection object and then recursively populating it with copies of the child objects found in the original. Copying an object this way walks the whole object tree to create a fully independent clone of the original object and all of its children.


我的简短tl;dr解释。

名为electron的变量指向一个特定的内存位置,我们称之为abcd1234

设置positron=electron时,只需将positron变量名指向与electron相同的内存位置(abcd1234


如何解决此问题

或者实例化一个单独的对象

使用copy库避免意外的浅拷贝

import copy

electron=particule("e-",0.511)
positron=copy.deepcopy(electron)
electron.name="e+"

print(positron.name , electron.name) #I get e-,e+

Here is another link for reference

希望这有帮助

Python是一种引用调用语言,因此每当您执行positron = electron时,它基本上会创建一个引用相同元素的新指针。因此,如果对其中任何一个对象进行更改,它们都将反映在这两个对象中。你们需要做的是,在这种情况下,你们使用的是一个类,所以若正电子要继承电子的属性,你们可以创建一个子类或者任何适合层次结构的类

相关问题 更多 >

    热门问题