我试图使用下面的replace_object()
之类的成员函数将Python对象分配给另一个就地。但是,如您所见,object_A
保持不变,复制object_B
的唯一方法是创建一个全新的对象object_C
,这违背了就地分配的目的。
这里发生了什么,我如何就地进行任务?
class some_class():
def __init__(self, attribute):
self.attribute = attribute
def replace_object(self, new_object):
self = new_object
# Does this line even have any effect?
self.attribute = new_object.attribute
self.new_attribute = 'triangle'
return self
object_A = some_class('yellow')
print(object_A.attribute) # yellow
object_B = some_class('green')
object_C = object_A.replace_object(object_B)
print(object_A.attribute) # yellow
print(object_C.attribute) # green
#print(object_A.new_attribute) # AttributeError!
print(object_B.new_attribute) # triangle
print(object_C.new_attribute) # triangle
我还尝试使用copy.copy()
来处理深层拷贝,但无济于事。
有趣的是,如果我更换
object_C = object_A.replace_object(object_B)
与
object_A = object_A.replace_object(object_B)
然后我得到了我想要的东西。但为什么self = new_object
内的replace_object()
语句可以实现相同的结果呢?
PS:我有充分的理由去做这个就地分配,所以虽然这可能不是一般的最佳做法,但请跟我一起去。
答案 0 :(得分:1)
您无法将对象分配给另一个'。您可以将新对象和现有对象分配给新名称和现有名称。
self = new_object
仅表示从现在起名称self
将引用new_object
',并且对旧对象不执行任何操作。 (注意self
只是一个变量名,就像任何其他名称一样,只有通过约定才能引用类定义中的对象。)
后续命令self.attribute = new_object.attribute
无效,因为self
已成为new_object
的重复标签。
您可以将新对象的所有属性复制到旧对象。最终会得到两个具有不同名称和相同属性的不同对象。除非overrode the equality operator用于这些对象,否则相等的测试(a == b
)将返回false。
要内联复制所有属性,您可以执行this:
之类的操作def replace_object(self, new_object):
self.__dict__ = new_object.__dict__.copy() # just a shallow copy of the attributes
有很多方法可以做任何你想做的事情。