我发现了一些有趣的结果
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是否有类似的方式让我区分它们?或提供一个列表来显示所有最常用的一个?
答案 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,而创建新对象的方法将返回所述对象。