在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方法,而不必担心对象是什么