In-place assignment operators (also called compound assignment operators) perform an operation in-place on a variable provided as first operand. They overwrite the value of the first operand variable with the result of the operation when performing the operator without assignment. For example, x += 3 is the same as x = x + 3 of first calculating the result of x + 3 and then assigning it to the variable x.
| Operator | Name | Short Example | Equivalent Long Example |
|---|---|---|---|
= | In-place Assignment | x = 3 | |
+= | In-place Addition | x += 3 | x = x + 3 |
-= | In-place Subtraction | x -= 3 | x = x - 3 |
*= | In-place Multiplication | x *= 3 | x = x * 3 |
/= | In-place Division | x /= 3 | x = x / 3 |
%= | In-place Modulo | x %= 3 | x = x % 3 |
//= | In-place Integer Division | x //= 3 | x = x // 3 |
**= | In-place Power | x **= 3 | x = x ** 3 |
&= | In-place Bitwise And | x &= 3 | x = x & 3 |
|= | In-place Bitwise Or | x |= 3 | x = x | 3 |
^= | In-place Bitwise XOR | x ^= 3 | x = x ^ 3 |
>>= | In-place Bitwise Shift Right | x >>= 3 | x = x >> 3 |
| <<= | In-place Bitwise Shift Left | x <<= 5 | x = x << 5 |
You can watch me go over all of these operators in the following video:
We’ll rush over all in-place operators one-by-one next!
Python In-Place Addition
Python provides the operator x += y to add two objects in-place by calculating the sum x + y and assigning the result to the first operands variable name x. You can set up the in-place addition behavior for your own class by overriding the magic “dunder” method __iadd__(self, other) in your class definition.
>>> x = 1 >>> x += 2 >>> x 3
The expression x += y is syntactical sugar for the longer-form x = x + y:
>>> x = 1 >>> x = x + 2 >>> x 3
Related Tutorial: Python In-Place Addition
Python In-Place Subtraction
Python provides the operator x -= y to subtract two objects in-place by calculating the difference x - y and assigning the result to the first operands variable name x. You can set up the in-place subtraction behavior for your own class by overriding the magic “dunder” method __isub__(self, other) in your class definition.
>>> x = 3 >>> x -= 2 >>> x 1
The expression x -= y is syntactical sugar for the longer-form x = x - y:
>>> x = 3 >>> x = x - 2 >>> x 1
Related Tutorial: Python In-Place Subtraction
Python In-Place Multiplication
Python provides the operator x *= y to multiply two objects in-place by calculating the product x * y and assigning the result to the first operands variable name x. You can set up the in-place multiplication behavior for your own class by overriding the magic “dunder” method __imul__(self, other) in your class definition.
>>> x = 2 >>> x *= 3 >>> x 6
The expression x *= y is syntactical sugar for the longer-form x = x * y:
>>> x = 2 >>> x = x * 3 >>> x 6
Related Tutorial: Python In-Place Multiplication
Python In-Place Division
Python’s in-place division operator x /= y divides two objects in-place by calculating x / y and assigning the result to the first operands variable name x. Set up in-place division for your own class by overriding the magic “dunder” method __truediv__(self, other) in your class definition.
>>> x = 4 >>> x /= 2 >>> x 2
The expression x /= y is syntactical sugar for the longer-form x = x / y:
>>> x = 4 >>> x = x / 2 >>> x 2
Related Tutorial: Python In-Place Division
Python In-Place Modulo
Python provides the operator x %= y to calculate the modulo operation x % y, and assign the result in-place to the first operands variable x. You can set up the in-place modulo behavior for your own class by overriding the magic “dunder” method __imod__(self, other) in your class definition.
>>> x = 9 >>> x %= 4 >>> x 1
The expression x %= y is syntactical sugar for the longer-form x = x % y:
>>> x = 9 >>> x = x % 4 >>> x 1
Related Tutorial: Python In-Place Modulo
Python In-Place Integer Division
Python’s in-place integer division operator x //= y divides two objects in-place by calculating x // y and assigning the result to the first operands variable name x. Set up in-place integer (or floor) division for your own class by overriding the magic “dunder” method __floordiv__(self, other) in your class definition.
>>> x = 5 >>> x //= 2 >>> x 2
The expression x /= y is syntactical sugar for the longer-form x = x / y:
>>> x = 5 >>> x = x // 2 >>> x 2
Related Tutorial: Python In-Place Integer Division
Python In-Place Exponentiation
Python provides the in-place exponentiation operator x **= y that raises x to the power of y using x ** y and assigns the result to the first operands variable name x. You can set up the in-place exponentiation behavior for your own class by overriding the magic “dunder” method __ipow__(self, other) in your class definition.
>>> x = 2 >>> x **= 3 >>> x 8
The expression x **= y is syntactical sugar for the longer-form x = x ** y:
>>> x = 2 >>> x = x ** 3 >>> x 8
Related Tutorial: Python In-Place Exponentiation
Python In-Place Bitwise AND
Python’s in-place bitwise AND operator x &= y calcualtes bitwise-and x & y and assigns the result to the first operand x. To set it up for your own class, override the magic “dunder” method __iand__(self, other) in your class definition.
>>> x = 1 >>> x &= 2 >>> x 0
The expression x &= y is syntactical sugar for the longer-form x = x & y:
>>> x = 1 >>> x = x & 2 >>> x 3
Related Tutorial: Python In-Place Bitwise AND
Python In-Place Bitwise OR
Python’s A |= B applies the | operator in place. Thus, it is semantically identical to the longer-form version A = A | B of first performing the operation A | B and then assigning the result to the variable A.
The following minimal example creates two Boolean variables A and B and performs the in-place B |= A operation to perform a logical OR operation B | A and assigning the result to the first operand B that becomes True:
>>> A = True >>> B = False >>> B |= A >>> B True
In this example, you’ve seen this in-place operation on Boolean operands. But the | operator is overloaded in Python. The three most frequent use cases for the | and |= operators are the following:
- Python Sets: set union operator
- Python Dictionaries: dictionary update operator
- Python Booleans: logical OR operator
Related Tutorial: Python In-Place Bitwise OR
Python In-Place Bitwise XOR
Python’s in-place bitwise XOR operator x ^= y calcualtes bitwise XOR x and assigns the result to the first operand ^ yx. To set this up for your own class, override the magic “dunder” method __ixor__(self, other) in your class definition.
>>> x = 1 >>> x ^= 2 >>> x 3
The expression x is syntactical sugar for the longer-form ^= yx = x :^ y
>>> x = 1 >>> x = x ^ 2 >>> x 3
Related Tutorial: Python In-Place Bitwise XOR
Python In-Place Bitwise Right-Shift
Python’s in-place bitwise right-shift operator x >>= y calculates the right-shift operation x >> y, and assigns the result to the first operands variable name x. You can set up the in-place right-shift behavior in your own class by overriding the magic “dunder” method __irshift__(self, other) in your class definition.
>>> x = 8 >>> x >>= 2 >>> x 2
The expression x >>= y is syntactical sugar for the longer-form x = x >> y:
>>> x = 8 >>> x = x >> 2 >>> x 2
Related Tutorial: Python In-Place Bitwise Right-Shift
Python In-Place Bitwise Left-Shift
Python’s in-place bitwise left-shift operator x <<= y calculates the left-shift operation x << y, and assigns the result to the first operands variable name x. You can set up the in-place left-shift behavior in your own class by overriding the magic “dunder” method __ilshift__(self, other) in your class definition.
>>> x = 8 >>> x <<= 2 >>> x 32
The expression x <<= y is syntactical sugar for the longer-form x = x << y:
>>> x = 8 >>> x = x << 2 >>> x 32
Related Tutorial: Python In-Place Bitwise Left-Shift
Python In-Place Magic Methods
The following table provides the names of the magic methods you need to define to enable in-place operators on your custom class:
| Method Name | Description |
|---|---|
__iadd__(self, other) | In-place addition |
__isub__(self, other) | In-place subtraction |
__imul__(self, other) | In-place multiplication |
__truediv__(self, other) | In-place and normal division |
__imod__(self, other) | In-place modulo |
__floordiv__(self, other) | In-place and normal integer division |
__ipow__(self, other) | In-place exponentiation |
__iand__(self, other) | In-place bitwise AND |
__ior__(self, other) | In-place bitwise OR |
__ixor__(self, other) | In-place bitwise XOR |
__irshift__(self, other) | In-place right-shift |
__ilshift__(self, other) | In-place left-shift |
In the following code example, we create a custom class Data and define our “magic” double-underscore methods so that we can perform in-place computations on objects of this class.
class Data:
def __init__(self, data):
self.data = data
def __iadd__(self, other):
self.data += other.data
return self
def __isub__(self, other):
self.data -= other.data
return self
def __imul__(self, other):
self.data *= other.data
return self
def __truediv__(self, other):
self.data /= other.data
return self
def __imod__(self, other):
self.data %= other.data
return self
def __floordiv__(self, other):
self.data //= other.data
return self
def __ipow__(self, other):
self.data **= other.data
return self
def __iand__(self, other):
self.data &= other.data
return self
def __ior__(self, other):
self.data |= other.data
return self
def __ixor__(self, other):
self.data ^= other.data
return self
def __irshift__(self, other):
self.data >>= other.data
return self
def __ilshift__(self, other):
self.data <<= other.data
return self
Let’s try these out!
# In-Place Addition x = Data(3) y = Data(2) x += y print(x.data) # 5 # In-Place Subtraction x = Data(3) y = Data(2) x -= y print(x.data) # 1 # In-Place Multiplication x = Data(3) y = Data(2) x *= y print(x.data) # 6 # In-Place Division x = Data(3) y = Data(2) x /= y print(x.data) # 1.5 # In-Place Modulo x = Data(3) y = Data(2) x %= y print(x.data) # 1 # In-Place Integer Division x = Data(3) y = Data(2) x //= y print(x.data) # 1 # In-Place Power x = Data(3) y = Data(2) x **= y print(x.data) # 9 # In-Place Bitwise AND x = Data(3) y = Data(2) x &= y print(x.data) # 2 # In-Place Bitwise OR x = Data(3) y = Data(2) x |= y print(x.data) # 3 # In-Place Bitwise XOR x = Data(3) y = Data(2) x ^= y print(x.data) # 1 # In-Place Bitwise Right-Shift x = Data(3) y = Data(2) x >>= y print(x.data) # 0 # In-Place Bitwise Left-Shift x = Data(3) y = Data(2) x <<= y print(x.data) # 12