24

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

我试图了解__iand__运营商。

我只是不知道是什么&=意思,并且在网上查过但找不到。

4

5 回答 5

30

解释

可以理解的是,您找不到太多参考。我发现也很难获得这方面的参考,但它们确实存在。

iiniand表示就地,因此它是 的就地运算符&。如果已实现,则&=调用操作员。__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'})

在这种情况下,由于freezeset 没有实现__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')

*(我说差不多是因为如果你检查字节码,你会发现底层实现对集合和冻结集合的处理是一样的,即使冻结集合没有__iand__,集合有,因为每个调用INPLACE_AND,至少对于编译函数。)

内置示例,二进制标志:

与 Sets 类似,我们可以使用&=来更新值为 的二元选项标志的True交集1。下面,我们证明二进制数和的“二进制与”(类似于交集)是:111010111010

>>> option_flags = int('1110', 2)
>>> option_flags
14
>>> option_flags &= int('1011', 2)
>>> option_flags
10
>>> bin(option_flags)
'0b1010'

由于int对象是不可变的,就像frozenset示例一样,这实际上只是将变量重新分配option_flags给新计算的值。

于 2014-01-20T16:15:03.967 回答
13

与其他一些答案相反,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  

之后我们有

>>> a = NewIand(1+2+4)
>>> b = NewIand(4+8+16)
>>> a & b
4
>>> a = a & b
>>> a
4

>>> a = NewIand(1+2+4)
>>> b = NewIand(4+8+16)
>>> a &= b
>>> a
99
于 2014-01-20T15:58:34.027 回答
7

它是以下的简写:

a = a & b

&按位and的(请参阅链接以获得进一步的解释)如果ab要么int要么long.

否则,该语句等效于:

a = a.__iand__(b)

if__iand__定义为a.

于 2014-01-20T15:27:19.870 回答
3

简单地说。在引擎盖下,它执行按位二进制操作。

例如二进制中的 5 是 0101,二进制中的 3 是 0011

现在在它们之间进行“与”运算(当两者都为 1 时结果为 1,否则为 0),您将得到二进制 0001,这意味着十进制中的 1。

x = 5
x &= 3
print(x)
output >>> 1
于 2020-02-29T09:30:46.123 回答
2

它与 非常相似+=。它的意思是

a = a & b
于 2014-01-20T15:27:32.790 回答