Aar*_*all 10
可以理解的是,你找不到太多的参考.我发现很难得到关于此的参考,但它们存在.
将i
在iand
指就地,所以它的就地运营商&
.如果实施,则&=
调用__iand__
操作员.如果没有实现,它就是一样的x = x & y
.
它主要用于更新内置集类型的交集:
>>> a = set('abc')
>>> a &= set('cbe')
>>> a
set(['c', 'b'])
Run Code Online (Sandbox Code Playgroud)
这与:
>>> a = set('abc')
>>> a.__iand__(set('cbe'))
set(['c', 'b'])
Run Code Online (Sandbox Code Playgroud)
它与调用set.intersection_update
方法非常相似,并且将用于控制流,就像对任何对象或变量进行就地更新一样(如果对象是不可变的).
不太常用的不可变冻结对象将在内存更新的内存中替换,变量名称将指向内存中的新对象.
>>> a = frozenset('abc')
>>> a &= set('bce')
>>> a
frozenset({'c', 'b'})
Run Code Online (Sandbox Code Playgroud)
在这种情况下,由于 frozenset没有实现__iand__
方法,
>>> a = frozenset('abc')
>>> a.__iand__(set('cbe'))
Traceback (most recent call last):
File "<pyshell#160>", line 1, in <module>
a = frozenset('abc'); a.__iand__(set('cbe'))
AttributeError: 'frozenset' object has no attribute '__iand__'
Run Code Online (Sandbox Code Playgroud)
它是(*几乎)相同,以
a = a & set('bce')
Run Code Online (Sandbox Code Playgroud)
*(我说几乎是因为如果你检查字节码,你会发现底层实现对待set和frozensets是相同的,即使frozensets没有__iand__
,并设置do,因为每次调用INPLACE_AND
,至少对于编译函数.)
与Sets类似,我们可以使用&=
更新二进制选项标志的交集,其中值为True
is 1
.下面,我们证明了" 二进制和二进制数字",(类似于路口)1110
和1011
是1010
:
>>> option_flags = int('1110', 2)
>>> option_flags
14
>>> option_flags &= int('1011', 2)
>>> option_flags
10
>>> bin(option_flags)
'0b1010'
Run Code Online (Sandbox Code Playgroud)
由于int
对象不可变,如frozenset
示例所示,这实际上只是将变量重新分配option_flags
给新计算的值.
与其他一些答案相反,a &= b
它并不是简写a = a & b
,虽然我承认它对内置不可变类型(如整数)的行为通常类似.
a &= b
__iand__
如果可用,可以调用特殊方法.为了看到差异,让我们定义一个自定义类:
class NewIand(object):
def __init__(self, x):
self.x = x
def __and__(self, other):
return self.x & other.x
def __iand__(self, other):
return 99
Run Code Online (Sandbox Code Playgroud)
之后我们有了
>>> a = NewIand(1+2+4)
>>> b = NewIand(4+8+16)
>>> a & b
4
>>> a = a & b
>>> a
4
Run Code Online (Sandbox Code Playgroud)
但
>>> a = NewIand(1+2+4)
>>> b = NewIand(4+8+16)
>>> a &= b
>>> a
99
Run Code Online (Sandbox Code Playgroud)
这是一个简写:
a = a & b
Run Code Online (Sandbox Code Playgroud)
&
是逐位and
(参见链接进一步的说明),如果a
和b
是任一int
或long
.
否则,该陈述相当于:
a = a.__iand__(b)
Run Code Online (Sandbox Code Playgroud)
如果__iand__
定义为a
.