Skip to content

How to Use Inplace Operators in Python

Learn how Python's inplace operators (ixor(), ipow(), iand(), ior(), ilshift(), irshift()) work with mutable/immutable types and simulate string modifications using slicing, list conversion, replace(), and regex.

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

Function Equivalent Operator Operation Example Result
operator.ixor(a, b) a ^= b Bitwise XOR ixor(10, 5) 15
operator.ipow(a, b) a **= b Exponentiation ipow(5, 4) 625
operator.iand(a, b) a &= b Bitwise AND iand(5, 4) 4
operator.ior(a, b) a |= b Bitwise OR ior(10, 5) 15
operator.ilshift(a, b) a <<= b Left shift ilshift(8, 2) 32
operator.irshift(a, b) a >>= b Right shift irshift(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

numbers = [3, 5, 7, 9]
result = reduce(operator.ixor, numbers)

print(f"XOR of {numbers} = {result}")

Output:

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

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

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

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

print(s)  # bAnana

Choosing the Right Method

Method Best For Creates New String?
String slicing Replacing a character at a known index Yes
List conversion Multiple modifications at various positions Yes (after join)
str.replace() Replacing all/first occurrences of a substring Yes
re.sub() Pattern-based or complex replacements Yes

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.

Navigation