3

可能重复:
如何在 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是否有类似的方法让我区分它们?或者提供一个列表来显示所有最常用的?

4

2 回答 2

1

与这里的一些现有答案相反,真正的原因实际上恰恰相反。+=旨在成为在 Python中修改self的就地运算符。但有一些问题。


对于元组和字符串等不可变类型,my_tuple += (1, )相当于my_tuple = my_tuple + (1, )创建一个对象然后将其分配给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)并且原始对象将被更新

于 2012-10-30T09:15:14.773 回答
0

没有命名约定。

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

于 2012-10-30T08:45:36.270 回答