Python:当相同的旧对象变为新对象时,制作对象的副本

时间:2012-02-20 18:21:00

标签: python class object

我已经基于默认的str类创建了新类。我还更改了__add____mul____repr__等默认方法。但是我希望在用户将旧变量等同于旧变量时更改默认行为。看看我现在拥有的东西:

a = stream('new stream')
b = a
b += ' was modified'
a == b
>>> True
print a
>>> stream('new stream was modified')
print b
>>> stream('new stream was modified')

因此,每当我修改第二个变量时,Python也会改变原始变量。据我所知,Python只需将变量a的地址发送给变量b。是否可以像通常str一样在创建时制作变量的副本?我认为我需要像C ++中的 new 一样。

a = 'new string'
b = a
b += ' was modified'
a == b
>>> False

P.S。对象的创建始于self。 new ()方法。创作是这样的:

def __new__(self, string):
  return(str.__new__(self, string))

它更复杂,因为它处理unicode和QString类型,首先从它们获取str对象,但我认为这不是必要的。

1 个答案:

答案 0 :(得分:1)

我不相信你可以改变赋值运算符的行为,但是有明确的方法来创建对象的副本而不仅仅是使用引用。对于复杂对象,请查看copy module。对于基本序列类型(如str),以下工作假设您正确实现切片:

代码

a = str('abc')

#A slice creates a copy of a sequence object. 
#[:] creates a copy of the entire thing.
b = a[:]

#Since b is a full copy of a, this will not modify a
b += ' was modified'

#Check the various values
print('a == b' + str(a == b))
print(a)
print(b)

输出

False
abc
abc was modified