为什么此set操作会更改set 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发布于 2016-04-17 03:34:58
Integer实现了&操作,但没有实现&=操作,所以当您使用x &= y时,它会扩展为x = x & y,它只是简单地重新分配x变量,而不是修改它的内部状态(对于&来说,改变一个值没有多大意义,就像它对+没有意义一样)。frozensets也是如此。
Set实现了&=操作,因此它不会扩展为变量重新赋值,而是改变运算符的左侧。
元组既不实现&,也不实现&=,因此出现错误是有意义的。然而,使用+=会得到相同的效果:对于元组,+=是扩展的,对于列表,它是一种原地突变,因为列表是可变的。
任何类都可以实现它们自己版本的这些运算符。详情请参见here。特别是,&对应于__and__,&=对应于__iand__。
如果你仔细想想,对于可变类来说,实现就地运算符以允许直接修改是一个明智的约定,而不是不可变的类。
https://stackoverflow.com/questions/36667517
复制相似问题