为什么此集合操作会更改集合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
Integers实现&
运算,但不实现&=
运算,因此当您使用x &= y
时,它被扩展到x = x & y
,CCD_9只是重新分配x
变量,而不是修改其内部状态(&
突变值没有多大意义,就像+
没有意义一样)。蛙类也是如此。
集合实现&=
操作,因此它不会扩展为变量重新分配,而是变异运算符的左侧。
元组既不实现&
也不实现&=
,因此错误是有意义的。然而,+=
也会产生同样的效果:对于元组,+=
是扩展的,对于列表,这是一种原位突变,因为列表是可变的。
任何类都可以实现它们自己版本的这些运算符。请参阅此处了解详细信息。特别地,CCD_ 18对应于CCD_ 19并且CCD_。
仔细想想,对于可变类来说,实现就地操作符以允许直接修改,但不允许不可变类,这是一个明智的约定。