python中的破坏性自然操作?

时间:2012-10-30 08:37:32

标签: python

  

可能重复:
  How to clone a list in python?

我发现了一些有趣的结果

a = [1, 2] 
b=a 
b.append(3) 
print a, b

#=> [1,2,3] [1,2,3]


a = [1, 2] 
b=a 
b += [3] 
print a, b

#=> [1,2] [1,2,3]

似乎有些操作改变了引用值,有些创建了一个新的。我记得在Ruby中它可以使用!来指示哪种方法具有这种破坏性。 python是否有类似的方式让我区分它们?或提供一个列表来显示所有最常用的一个?

2 个答案:

答案 0 :(得分:1)

与此处的一些现有答案相反,真正的原因实际上恰恰相反。 +=意味着是一个在Python中修改 self 的就地运算符。但它有一些问题。


对于元组和字符串等不可变类型,my_tuple += (1, )等同于my_tuple = my_tuple + (1, ),它创建 new 对象,然后将其分配给my_tuple

>>> my_tuple = (1,2,3)
>>> t = my_tuple
>>> t += (2,)
>>> t
(1, 2, 3, 2)
>>> my_tuple
(1, 2, 3)

这是因为元组和字符串等不可变类型不实现__iadd__(例如,您可以通过dir(tuple)进行检查)。在这种情况下,它会回退使用__add__。这将创建一个新对象并将其分配给原始变量。


但是对于某些可变类型(如列表和词典),__iadd__已实现,+=将调用它:

>>> inspect.getdoc(list.__iadd__)
'x.__iadd__(y) <==> x+=y'

>>> a = [1,2,3]
>>> b = a
>>> b += [4]
>>> b
[1, 2, 3, 4]
>>> a
[1, 2, 3, 4]

因此,对于可变类型,执行此就地操作(通过修改 self )和original object will be updated

答案 1 :(得分:-1)

没有命名约定。

但是,使用的是修改对象的方法返回None,而创建新对象的方法将返回所述对象。