Python a &= b 是什么意思?

标签 python operators ampersand in-place

&= 运算符在 Python 中是什么意思,您能给我一个工作示例吗?

I am trying to understand the __iand__ operator.

我只是不知道&=是什么意思,上网查了也没找到。

最佳答案

a &= b 是什么意思?

这取决于 ab 类型的实现,但语义本质上是这样

a &= b

a 的更新,其中包含 b 的“AND”。该“与”运算可以是集合交集、二元与运算或其他可以由程序员实现的运算。

所以有多种实现方式。

在接下来的部分中,我演示了 __and____iand__ 并给出了多个类型示例,这些类型在下面有不同的语义(set,其中 a 对象是就地变异的,而 frozensetint 是不可变的,所以变量 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。下面,我们演示二进制数 11101011 的“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/

相关文章:

c++如何定义不复制数据的强制转换运算符?

reference - 循环变量前的 `&`有什么作用?

javascript - 是否有新的 ES6+ 运算符的组合可以在对象数组中添加串联字段?

c - 为什么我不需要 scanf 的符号? (在 C 中)

c# - 如何在aspx页面的标签控件中显示 `&amp;`

python - 在 Flask 中使用隐藏字段_method 更改请求方法

python - 将压缩的 csv 从 S3 读入 python 数据帧

python "round robin"

python - 使用 turtle.onclick() 改变一个变量

c# - 使用变量否定 'is' 运算符仅适用于 '!' 但不适用于 '== false'