Python a& = b是什么意思?

时间:2014-01-20 15:25:46

标签: python operators ampersand in-place

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

I am trying to understand the __iand__ operator.

我只是不知道&=意味着什么,并且已经在线查看但找不到它。感谢。

5 个答案:

答案 0 :(得分:9)

与其他一些答案相反,a &= b是{em>不是 a = a & b的简写,但我承认它对内置不可变类型(如整数)的行为通常类似。 / p>

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

答案 1 :(得分:8)

说明

可以理解的是,你找不到太多的参考资料。 I find it hard to get references on this too, but they exist.

i中的iand表示就地,因此它是&的就地运算符。 &=调用__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方法非常相似,并且将用于控制流,就像对任何对象或变量进行就地更新一样(如果对象是不可变的)。

未实现的内置示例

不常用的不可变冻结对象将在内存更新的内存中替换,变量名称将指向内存中的新对象。

>>> 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')

*(我说几乎因为如果你检查字节码,你会看到底层实现对集合和frozensets的处理方式相同,即使frozensets没有__iand__,并设置do,因为每次调用INPLACE_AND,至少对于已编译的函数。)

内置示例,二进制标志:

与集合类似,我们可以使用&=更新二进制选项标记的交集,其中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重新分配给新计算的值。

答案 2 :(得分:5)

这是一个简写:

a = a & b
如果&abint,则

longbitwise and(有关详细说明,请参阅链接)。

否则,该陈述相当于:

a = a.__iand__(b)

如果为__iand__定义a

答案 3 :(得分:2)

+=非常相似。这意味着

a = a & b

答案 4 :(得分:1)

简而言之。在后台,它执行按位二进制操作。

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

现在在它们之间进行“与”运算(当两者均为1时,结果为1,否则为0),您将获得二进制0001,表示十进制为1。

x = 5
x &= 3
print(x)
output >>> 1