为什么Python&=&引用;设置运算符的操作与“设置”不同&=&引用;整数运算?

为什么Python&=&引用;设置运算符的操作与“设置”不同&=&引用;整数运算?,python,python-2.7,Python,Python 2.7,为什么此设置操作会更改设置s?对于同一运算符的整数(按位)版本,其工作方式不同 设置操作&=(更改s): 结果: set(['a', 'c', 'b']) set(['a', 'c', 'b']) set(['c', 'b', 'd']) set(['c', 'b']) set(['c', 'b']) set(['c', 'b', 'd']) 按位操作&=(不改变s): 结果: 7 7 3 3 7 3 整数执行&操作,但不执行&=操作,因此当您使用x&=y时,它被扩展为x=x&y,只需重

为什么此设置操作会更改设置
s
?对于同一运算符的整数(按位)版本,其工作方式不同

设置操作
&=
(更改
s
):

结果:

set(['a', 'c', 'b']) set(['a', 'c', 'b']) set(['c', 'b', 'd'])

set(['c', 'b']) set(['c', 'b']) set(['c', 'b', 'd'])
按位操作
&=
(不改变
s
):

结果:

7 7 3

3 7 3

整数执行
&
操作,但不执行
&=
操作,因此当您使用
x&=y
时,它被扩展为
x=x&y
,只需重新分配
x
变量,而不是修改其内部状态(对
&
来说,变异一个值没有多大意义,就像对
+
来说没有多大意义一样)。对冻结集也是如此

集合实现
&=
操作,因此它不会扩展为变量重新分配,而是变异运算符的左侧

元组既不实现
&
也不实现
&=
,因此错误是有意义的。但是,对于
+=
,您会得到相同的效果:对于元组,
+=
是展开的,对于列表,它是就地突变,因为列表是可变的

任何类都可以实现它们自己版本的这些运算符。有关详细信息,请参见。尤其是
&
对应于
\uuuu和
,而
&=
对应于
\uu和


仔细想想,可变类实现就地运算符以允许直接修改,而不是不可变类,这是一个明智的约定。

集合是可变的,整数不是。请使用
冻结集试试。
。它与预期的冻结集一样工作。因此,该操作不会试图修改集合u(与语句开头的s相同的对象)它试图做什么?列表显示与&=的集相同的行为。元组导致类型错误。是的。列表也是可变的。元组不是。冻结集是不可变的,但不会导致类型错误。记录可变类型与不可变类型的&=行为在哪里?谢谢。你给了我足够的信息在Python 2.7.11文档中查找“增强赋值”、PEP-203以及我的答案的信息。
s = 7
t = 3
u=s
print u, s, t
u &= t
print u, s, t
7 7 3

3 7 3