为什么Python"& ="设置操作符的行为与"& ="不同整数运算?

时间:2016-04-16 17:42:25

标签: python python-2.7

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

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

s = set('abc')
t = set('bcd')
u=s
print u, s, t
u &= t
print u, s, t

结果:

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

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

按位操作&=(不会更改s):

s = 7
t = 3
u=s
print u, s, t
u &= t
print u, s, t

结果:

7 7 3

3 7 3

1 个答案:

答案 0 :(得分:5)

整数实现&操作,但不实施&=操作,因此当您使用x &= y时,它会扩展为x = x & y,只会重新分配x变量而不是修改它的内部状态(&改变一个值是没有意义的,就像它对+没有意义一样。对于frozensets也一样。

设置实现&=操作,使其不会扩展为变量重新分配,而是改变操作符的左侧。

元组既不实现&也不实现&=,因此错误是有道理的。但是,使用+=可以获得相同的效果:对于元组+=的扩展,对于列表,它是一个就地突变,因为列表是可变的。

任何类都可以实现这些运算符的自己版本。有关详细信息,请参阅here。特别是&对应__and__&=__iand__

如果你考虑一下,对于可变类来说,实现就地运算符以允许直接修改,而不是不可变类是一个明智的约定。