为什么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