Skip to main content

How to Use Inplace Operators in Python

Python's operator module provides a set of inplace operator functions that combine an operation with assignment in a single call. These functions mirror Python's augmented assignment operators (^=, **=, &=, |=, <<=, >>=) and are especially useful when you need to pass operators as function arguments - for example, to higher-order functions like reduce(), callbacks, or dynamic dispatch tables.

This guide covers the bitwise and exponentiation inplace operators, explains how they work with both mutable and immutable types, and also explores techniques for simulating in-place string modifications in Python.

Understanding Inplace Operators

Inplace operators attempt to modify a value in place and return the result. For mutable containers (like lists and dictionaries), the modification happens directly on the original object. For immutable types (like integers, strings, and tuples), a new object is created and returned instead - the original remains unchanged.

All inplace operator functions follow this pattern:

result = operator.iop(a, b)  # Equivalent to: a op= b where op is an operator

Bitwise XOR and Exponentiation: ixor() and ipow()

ixor(a, b) - Inplace XOR (a ^= b)

Performs a bitwise exclusive OR and returns the result:

import operator

x = 10 # Binary: 1010
result = operator.ixor(x, 5) # Binary: 0101

print(f"10 ^ 5 = {result}")

Output:

10 ^ 5 = 15

How it works: 1010 XOR 0101 = 1111 → decimal 15. Each bit is 1 only if the corresponding bits of the operands differ.

ipow(a, b) - Inplace Power (a **= b)

Raises a to the power of b and returns the result:

import operator

result = operator.ipow(5, 4)

print(f"5 ** 4 = {result}")

Output:

5 ** 4 = 625

Bitwise AND and OR: iand() and ior()

iand(a, b) - Inplace AND (a &= b)

Performs a bitwise AND - the result bit is 1 only if both corresponding bits are 1:

import operator

result = operator.iand(5, 4) # 0101 AND 0100

print(f"5 & 4 = {result}")

Output:

5 & 4 = 4

ior(a, b) - Inplace OR (a |= b)

Performs a bitwise OR - the result bit is 1 if either corresponding bit is 1:

import operator

result = operator.ior(10, 5) # 1010 OR 0101

print(f"10 | 5 = {result}")

Output:

10 | 5 = 15

Bitwise Shifts: ilshift() and irshift()

ilshift(a, b) - Inplace Left Shift (a <<= b)

Shifts the bits of a to the left by b positions, effectively multiplying by 2^b:

import operator

result = operator.ilshift(8, 2) # 8 * (2^2) = 8 * 4

print(f"8 << 2 = {result}")

Output:

8 << 2 = 32

irshift(a, b) - Inplace Right Shift (a >>= b)

Shifts the bits of a to the right by b positions, effectively performing integer division by 2^b:

import operator

result = operator.irshift(8, 2) # 8 // (2^2) = 8 // 4

print(f"8 >> 2 = {result}")

Output:

8 >> 2 = 2

Complete Reference Table

FunctionEquivalent OperatorOperationExampleResult
operator.ixor(a, b)a ^= bBitwise XORixor(10, 5)15
operator.ipow(a, b)a **= bExponentiationipow(5, 4)625
operator.iand(a, b)a &= bBitwise ANDiand(5, 4)4
operator.ior(a, b)a |= bBitwise ORior(10, 5)15
operator.ilshift(a, b)a <<= bLeft shiftilshift(8, 2)32
operator.irshift(a, b)a >>= bRight shiftirshift(8, 2)2

Practical Example: Using Inplace Operators as Callbacks

One of the main advantages of the operator module functions is that they can be passed as arguments to other functions. This is useful in functional programming patterns:

import operator
from functools import reduce

# Compute XOR of all elements in a list
numbers = [3, 5, 7, 9]
result = reduce(operator.ixor, numbers)

print(f"XOR of {numbers} = {result}")
# 3 ^ 5 = 6, 6 ^ 7 = 1, 1 ^ 9 = 8

Output:

XOR of [3, 5, 7, 9] = 8
note

You cannot pass the ^= operator directly to reduce(), but operator.ixor makes it possible.

Mutable vs. immutable behavior

For immutable types like int, float, str, and tuple, inplace operators always create and return a new object. The original value is not modified:

import operator

x = 10
y = operator.ixor(x, 5)

print(f"x = {x}") # x is still 10
print(f"y = {y}") # y is 15

Output:

x = 10
y = 15

For mutable types like lists (with compatible operations like iadd for concatenation), the original object is modified in place.

In-Place String Modifications in Python

Strings in Python are immutable - you cannot change individual characters directly. However, you can simulate in-place modifications using several techniques.

Using String Slicing

String slicing creates a new string with the desired modification. It is concise and efficient for small, targeted changes:

s = "banana"
s = s[:1] + 'A' + s[2:]

print(s)

Output:

bAnana

This replaces the character at index 1 with 'A' by concatenating three parts: everything before index 1, the new character, and everything after index 2.

Using List Conversion

Converting a string to a list allows you to modify individual characters freely, then join them back:

s = "banana"
chars = list(s)
chars[1] = 'A'
s = ''.join(chars)

print(s)

Output:

bAnana

This approach is best when you need to make multiple modifications at different positions.

Using str.replace()

For replacing all occurrences of a specific character or substring, str.replace() is the simplest option:

s = "banana"
s = s.replace('a', 'A')

print(s)

Output:

bAnAnA
replace() replaces ALL occurrences by default

If you only want to replace the first occurrence, pass a third argument:

# ❌ Replaces all 'a' characters
s = "banana".replace('a', 'A')
print(s) # bAnAnA

# ✅ Replaces only the first occurrence
s = "banana".replace('a', 'A', 1)
print(s) # bAnana

Using Regular Expressions

For pattern-based modifications that go beyond simple character replacement, use the re module:

import re

s = "banana"
s = re.sub(r'a', 'A', s)

print(s)

Output:

bAnAnA

Regular expressions are powerful for complex patterns, such as replacing only vowels, digits, or text matching a specific structure:

import re

# Replace only the first 'a' that follows 'b'
s = "banana"
s = re.sub(r'(?<=b)a', 'A', s)

print(s) # bAnana

Choosing the Right Method

MethodBest ForCreates New String?
String slicingReplacing a character at a known indexYes
List conversionMultiple modifications at various positionsYes (after join)
str.replace()Replacing all/first occurrences of a substringYes
re.sub()Pattern-based or complex replacementsYes

Conclusion

Python's inplace operator functions in the operator module (ixor(), ipow(), iand(), ior(), ilshift(), irshift()) provide a functional interface to augmented assignment operations.

  • They are particularly valuable when operators need to be passed as arguments to higher-order functions like reduce().

  • For immutable types like integers and strings, these functions return new values rather than modifying in place.

When working with strings specifically, techniques like slicing, list conversion, str.replace(), and regular expressions offer flexible ways to simulate in-place modifications despite Python's string immutability.