operators – Python a &= b meaning?

operators – Python a &= b meaning?

Explanation

Understandable that you cant find much reference on it. I find it hard to get references on this too, but they exist.

The i in iand means in-place, so its the in-place operator for &. &= calls the __iand__ operator, if it is implemented. If not implemented, it is the same as x = x & y.

Built-in Example, Sets:

Its primarily used to update the intersection of built-in set types:

>>> a = set(abc) 
>>> a &= set(cbe)
>>> a
set([c, b])

which is the same as:

>>> a = set(abc)
>>> a.__iand__(set(cbe))
set([c, b])

It is very similar to calling the set.intersection_update method, and would be used in control flow as you would do an in-place update of any object or variable (if the object is immutable).

Unimplemented Built-in Example

The less commonly used immutable frozenset object would be replaced in memory on the inplace update, and the variable name would point to the new object in memory.

>>> a = frozenset(abc)
>>> a &= set(bce)
>>> a
frozenset({c, b})

In this case, since frozenset doesnt implement an __iand__ method,

>>> 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__

it is (*nearly) identical to

a = a & set(bce)

*(I say nearly because if you examine the bytecode, youll see that the underlying implementation treats sets and frozensets the same, even though frozensets dont have __iand__, and sets do, because each calls INPLACE_AND, at least for compiled functions.)

Built-in Example, Binary Flags:

Similar to Sets, we can use the &= to update the intersection of binary option flags where the value for True is 1. Below, we demonstrate that the binary AND, (akin to intersection) of the binary numbers 1110 and 1011 is 1010:

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

Since int objects are not mutable, like the frozenset example, this actually only reassigns the variable option_flags to the newly calculated value.

Contrary to some of the other answers, a &= b is not shorthand for a = a & b, though I admit it often behaves similarly for built-in immutable types like integers.

a &= b can call the special method __iand__ if available. To see the difference, lets define a custom class:

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  

After which we have

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

but

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

operators – Python a &= b meaning?

It is a shorthand for:

a = a & b

& is bitwise and (see link for further explanation) if a and b are either int or long.

Otherwise, the statement is equivalent to:

a = a.__iand__(b)

if __iand__ is defined for a.

Leave a Reply

Your email address will not be published. Required fields are marked *