python中两个赋值运算符的区别是什么?

python中两个赋值运算符的区别是什么?,python,Python,对于像整数这样的不可变类型,a-=b与a=a-b是一样的:它创建一个新值,a-b,并重新绑定名称a,以引用该新值而不是旧值 但是对于集合之类的可变类型,a-=b会更改a指向的值。(它还将a重新绑定到它已经引用的相同值,但这并不重要。) 查看这一点的最佳方法是查看对象的标识: In [41]: d = set(range(3)) In [42]: for i in d: d = d - set([2]) ....: In [43]: d Out[43]: set([0,

对于像整数这样的不可变类型,
a-=b
a=a-b
是一样的:它创建一个新值,
a-b
,并重新绑定名称
a
,以引用该新值而不是旧值

但是对于集合之类的可变类型,
a-=b
会更改
a
指向的值。(它还将
a
重新绑定到它已经引用的相同值,但这并不重要。)

查看这一点的最佳方法是查看对象的标识:

In [41]: d = set(range(3))

In [42]: for i in d:
    d = d - set([2])
   ....:     

In [43]: d
Out[43]: set([0, 1])
请注意,
-=
使
s1
仍然引用与
s2
相同的集合,并更改该集合;
-
s1
留给具有不同
id
的全新集合,并且不影响
s2


在封面下,
a=a-b
大致相当于
a=a.\uuu sub\uuuuuuuuuuub
,而
a-=b
则相当于
a。除此之外,如果没有
\uu isub\uuu
方法,
a-=b
只使用
\uu sub\uu

\uuuu isub\uuuu
更改值,而
\uuuu sub\uuuu
返回一个新值这一事实并不是由语言强制执行的,但它适用于所有内置类型和stdlib类型,也适用于任何自定义类型。文档中对其进行了描述:

这些[
\uuuuuifoo\uuuuu
]方法应该尝试就地执行操作(修改self)并返回结果(可能是,但不一定是self)。如果未定义特定的方法,则扩充赋值将返回到正常方法。例如,要执行语句
x+=y
,其中x是具有
\uuIdd\uIdd()
方法的类的实例,将调用
x.\uIdd\uIdd(y)
。如果x是未定义
\uuu iadd\uuuu()
方法的类的实例,则考虑
x.\uuu add\uuuuuu(y)
y.\uu radd\uuuuu(x)
的计算



*它不是完全等价的,因为(a)
\uu rsub\uuu
,(b)在C中实现的类型(如
set
),以及(C)用于查找某些特殊方法的规则与普通方法不同。

该死的搜索和运算符。这肯定是重复的。我也这么想。搜索
\uuu iadd\uuuuu
\uuuu isub\uuuu
等应该更容易些。但我发现的第一件事是关于如何实现+=,而不是它做什么,它被接受的答案是误导性的。
In [41]: d = set(range(3))

In [42]: for i in d:
    d = d - set([2])
   ....:     

In [43]: d
Out[43]: set([0, 1])
>>> s1 = set(range(3))
>>> s2 = s1
>>> s1, id(s1), s2, id(s2)
({0, 1, 2}, 4303749432, {0, 1, 2}, 4303749432)
>>> s1 -= {1}
>>> s1, id(s1), s2, id(s2)
({0, 2}, 4303749432, {0, 2}, 4303749432)
>>> s1 = s1 - {2}
>>> s1, id(s1), s2, id(s2)
({0}, 4303749664, {0, 2}, 4303749432)