Python a&= b是什么意思?

Aar*_*ier 7 python operators in-place ampersand

&=运算符在Python中意味着什么,你能给我一个有效的例子吗?

我想了解__iand__运营商.

我只是不知道是什么&=意思,并已在网上看,但找不到它.谢谢.

Aar*_*all 10

说明

可以理解的是,你找不到太多的参考.我发现很难得到关于此的参考,但它们存在.

iiand就地,所以它的就地运营商&.如果实施,则&=调用__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类似,我们可以使用&=更新二进制选项标志的交集,其中值为Trueis 1.下面,我们证明了" 二进制和二进制数字",(类似于路口)111010111010:

>>> 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给新计算的值.


DSM*_*DSM 9

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


Ste*_*ppo 5

这是一个简写:

a = a & b
Run Code Online (Sandbox Code Playgroud)

&逐位and(参见链接进一步的说明),如果ab是任一intlong.

否则,该陈述相当于:

a = a.__iand__(b)
Run Code Online (Sandbox Code Playgroud)

如果__iand__定义为a.