&=
运算符在 Python 中是什么意思,您能给我一个工作示例吗?
I am trying to understand the __iand__
operator.
我只是不知道&=
是什么意思,上网查了也没找到。
最佳答案
a &= b
是什么意思?
这取决于 a
和 b
类型的实现,但语义本质上是这样
a &= b
是 a
的更新,其中包含 b
的“AND”。该“与”运算可以是集合交集、二元与运算或其他可以由程序员实现的运算。
所以有多种实现方式。
在接下来的部分中,我演示了 __and__
和 __iand__
并给出了多个类型示例,这些类型在下面有不同的语义(set
,其中 a
对象是就地变异的,而 frozenset
和 int
是不可变的,所以变量 a
现在指向新对象)。
解释
可以理解,您找不到太多关于它的引用资料。 I find it hard to get references on this too, but they exist.
iand
中的i
表示就地,所以它是&
的就地运算符。 &=
调用 __iand__
运算符(如果已实现)。如果未实现,则与 x = x & y
相同。
内置示例,集合:
主要用于更新内置集合类型的交集:
>>> a = set('abc')
>>> a &= set('cbe')
>>> a
set(['c', 'b'])
这与:
>>> a = set('abc')
>>> a.__iand__(set('cbe'))
set(['c', 'b'])
它与调用 set.intersection_update
方法非常相似,并且可以在控制流中使用,就像您对任何对象或变量(如果对象是不可变的)进行就地更新一样.
未实现的内置示例
不太常用的不可变 frozenset 对象将在就地更新时在内存中被替换,变量名称将指向内存中的新对象。
>>> a = frozenset('abc')
>>> a &= set('bce')
>>> a
frozenset({'c', 'b'})
在这种情况下,因为 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__'
它 *(几乎)相同
a = a & set('bce')
*(我说 nearly 因为如果你检查字节码,你会发现底层实现对 sets 和 frozensets 的处理方式相同,即使 frozensets 没有 __iand__
和 sets 做,因为每个调用 INPLACE_AND
,至少对于编译函数。)
内置示例,二进制标志:
与 Sets 类似,我们可以使用 &=
更新二进制选项标志的交集,其中 True
的值为 1
。下面,我们演示二进制数 1110
和 1011
的“binary AND”(类似于交集)是 1010
:
>>> option_flags = int('1110', 2)
>>> option_flags
14
>>> option_flags &= int('1011', 2)
>>> option_flags
10
>>> bin(option_flags)
'0b1010'
因为 int
对象是不可变的,就像 frozenset
示例一样,这实际上只是将变量 option_flags
重新分配给新计算的值。
关于Python a &= b 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21237767/