为什么设置操作更改集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
答案 0 :(得分:5)
整数实现&
操作,但不实施&=
操作,因此当您使用x &= y
时,它会扩展为x = x & y
,只会重新分配x
变量而不是修改它的内部状态(&
改变一个值是没有意义的,就像它对+
没有意义一样。对于frozensets也一样。
设置实现&=
操作,使其不会扩展为变量重新分配,而是改变操作符的左侧。
元组既不实现&
也不实现&=
,因此错误是有道理的。但是,使用+=
可以获得相同的效果:对于元组+=
的扩展,对于列表,它是一个就地突变,因为列表是可变的。
任何类都可以实现这些运算符的自己版本。有关详细信息,请参阅here。特别是&
对应__and__
和&=
对__iand__
。
如果你考虑一下,对于可变类来说,实现就地运算符以允许直接修改,而不是不可变类是一个明智的约定。