Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.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中指定同一类的多个Instances中的数据属性_Python - Fatal编程技术网

在python中指定同一类的多个Instances中的数据属性

在python中指定同一类的多个Instances中的数据属性,python,Python,我已经看到,尽管症状相似,但在使用\uuuu init\uuu时,我定义类的方式不同: >>> class foo(object): ... def __init__(self,x): ... self.x = x ... >>> 接下来,我将定义此类的一个实例: >>> inst1 = foo(10) >>> inst1.x 10 现在,我想将同一个实例复制到一个新变量中,然后更改x的值: &

我已经看到,尽管症状相似,但在使用
\uuuu init\uuu
时,我定义类的方式不同:

>>> class foo(object):
...     def __init__(self,x):
...         self.x = x
... 
>>>
接下来,我将定义此类的一个实例:

>>> inst1 = foo(10)
>>> inst1.x
10
现在,我想将同一个实例复制到一个新变量中,然后更改x的值:

>>> inst2 = inst1
>>> inst2.x = 20
>>> inst2.x
20
然而,(像类级属性一样)所有数据属性在inst1和inst2之间共享,因为改变inst2的x值也会改变inst1的x值:

>>> inst1.x
20
我知道另一种方法是:

>>>  inst2 = foo(20)

但是,我不喜欢这样做,因为我的实际类需要很多输入参数,在创建不同实例时,我只需要更改其中的一个或两个特定数据属性(即,对于所有实例,其余的输入参数保持不变。非常感谢您的建议!

您没有复制类实例(对象)。下面一行

>>> inst2 = inst1
复制
inst1
的引用。它不复制对象

确认这一点的简单方法是查看内置的
id()
-函数的结果,该函数为每个python对象生成一个唯一的内存地址。在这种情况下
inst2
inst1
的值应该相同


解决这个问题的一个简单方法是使用Joran的答案。

您没有复制类实例(对象)

>>> inst2 = inst1
class foo(object):
    def __init__(self,x):
         self.x = x
    def copy(self):
        return foo(self.x)

foo2 = foo1.copy()
复制
inst1
的引用。它不复制对象

确认这一点的简单方法是查看内置的
id()
-函数的结果,该函数为每个python对象生成一个唯一的内存地址。在这种情况下
inst2
inst1
的值应该相同

解决这个问题的一个简单方法是使用Joran的答案

class foo(object):
    def __init__(self,x):
         self.x = x
    def copy(self):
        return foo(self.x)

foo2 = foo1.copy()
这是一种非常安全的实现方法

还有内置的复制方法

from copy import deepcopy
foo2 = deepcopy(foo1)
如果定义了
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

class foo2:
     def __init__(self,val):
         self.state = 0
         self.val = val

     def __copy__(self):
         newfoo = foo2(self.val)
         newfoo.state = self.state
         print "Copied self:",self
         return newfoo

from copy import copy
f = foo2(5)
f2 = copy(f)  #will do copy we defined
这将使您的代码更加通用,允许您在所有对象上只使用copy方法,而不必担心对象是什么

这是一种非常安全的实现方法

还有内置的复制方法

from copy import deepcopy
foo2 = deepcopy(foo1)
如果定义了
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

class foo2:
     def __init__(self,val):
         self.state = 0
         self.val = val

     def __copy__(self):
         newfoo = foo2(self.val)
         newfoo.state = self.state
         print "Copied self:",self
         return newfoo

from copy import copy
f = foo2(5)
f2 = copy(f)  #will do copy we defined
这将使您的代码更加通用,允许您在所有对象上只使用copy方法,而不必担心对象是什么