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

M. *_*ley 5 python python-2.7

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

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

s = set('abc')
t = set('bcd')
u=s
print u, s, t
u &= t
print u, s, t
Run Code Online (Sandbox Code Playgroud)

结果:

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

set(['c', 'b']) set(['c', 'b']) set(['c', 'b', 'd'])
Run Code Online (Sandbox Code Playgroud)

按位运算&=(不变s):

s = 7
t = 3
u=s
print u, s, t
u &= t
print u, s, t
Run Code Online (Sandbox Code Playgroud)

结果:

7 7 3

3 7 3
Run Code Online (Sandbox Code Playgroud)

Ale*_*all 5

整数实现&操作但不实现&=操作,所以当你使用x &= y它时会扩展到x = x & y简单地重新分配x变量而不是修改它的内部状态(&改变一个值没有多大意义,就像它没有意义一样for +).对于frozensets也是如此.

设置实现&=操作,因此它不会扩展为变量重新分配,而是改变操作符的左侧.

元组既不实现,&也不实现&=错误.但是你会得到同样的效果+=:对于元组+=扩展,对于列表它是一个就地突变,因为列表是可变的.

任何类都可以实现这些运算符的自己版本.详情请见此处.特别是&对应于__and__&=__iand__.

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