Introduction
The Walrus Operator (:=), introduced in Python 3.8, is a syntactic addition that allows assignment and evaluation in a single expression. Its official name is the assignment expression operator, but it’s commonly called the walrus operator due to its resemblance to a pair of eyes and tusks (:=).
This operator provides a concise and expressive way to assign values while using them within larger expressions—particularly in while loops, list comprehensions, conditional statements, and generator expressions.
Basic Syntax
variable := expression
It means: “evaluate expression, assign it to variable, and return its value.”
This differs from a normal assignment (=), which is a statement in Python and cannot be used inside expressions.
Example: Classic vs Walrus
Before (without walrus operator):
value = input("Enter: ")
while value != "quit":
print(f"You typed {value}")
value = input("Enter: ")
After (with walrus operator):
while (value := input("Enter: ")) != "quit":
print(f"You typed {value}")
✅ Shorter, cleaner, and avoids redundancy.
Why Was It Introduced?
The primary goals of the walrus operator:
- Reduce repetition of expressions
- Improve performance by avoiding reevaluation
- Enhance readability in loop and conditional patterns
- Enable cleaner code for inline assignments
Key Use Cases
1. while Loops with Input or Calculation
while (line := input()) != "":
print(f"Line: {line}")
No need to duplicate the input() call outside the loop.
2. List Comprehensions with Filtering
results = [y for x in data if (y := transform(x)) is not None]
Assign and use y in a single line, avoiding recalculating transform(x).
3. Conditional Logic
if (length := len(mylist)) > 5:
print(f"List is too long: {length}")
This avoids calling len(mylist) twice.
4. Regex Matching
import re
if (match := re.search(r"\d+", "Order123")):
print(f"Found number: {match.group()}")
Perfect for pattern matching scenarios.
Rules and Limitations
| Rule | Explanation |
|---|---|
| Can only be used in expressions | Not allowed as a standalone statement |
Not allowed at top-level in if/while | Must be enclosed in parentheses |
| Cannot reassign inside lambdas | SyntaxError if attempted |
| Assignment occurs before evaluation | Changes state as a side effect |
Not Allowed
# ❌ SyntaxError
if length := len(mylist): # missing parentheses
print(length)
✅ Fix:
if (length := len(mylist)):
print(length)
Comparison: = vs :=
| Feature | = Assignment Statement | := Assignment Expression |
|---|---|---|
| Type | Statement | Expression |
| Return value | None | Returns assigned value |
| Usable inside expr? | ❌ No | ✅ Yes |
| Introduced in | Python 0.x | Python 3.8 |
Benefits
| Benefit | Description |
|---|---|
| Eliminates redundancy | Avoids repeating function calls or expressions |
| Cleaner code | Reduces extra lines or setup variables |
| Improves performance | Especially in loops with expensive operations |
| Enables expressive one-liners | Makes list comprehensions and generators tighter |
Potential Downsides
| Concern | Details |
|---|---|
| Reduced clarity | Overuse can make expressions harder to read |
| Misuse in nested logic | May confuse readers unfamiliar with syntax |
| Hidden side effects | Assignments may not be obvious |
| Requires Python 3.8+ | Not backward compatible |
Use with any() / all()
if any((word := w).startswith("error") for w in words):
print(f"Found error word: {word}")
Each iteration assigns w to word, and it’s available after the loop if match was found.
Use in Function Arguments? ❌
# ❌ Invalid
print(len(x := [1, 2, 3]))
This will raise a SyntaxError because := cannot appear directly in function argument lists.
✅ Alternative:
x = [1, 2, 3]
print(len(x))
Or:
print((x := [1, 2, 3]) and len(x))
Common Patterns
Reading from a file
with open("data.txt") as f:
while (line := f.readline()):
print(line.strip())
Capturing match object
if (match := re.match(r"Name: (\w+)", "Name: Alice")):
print(match.group(1)) # Alice
Walrus in List Comprehensions
results = [n for x in nums if (n := x * 2) > 10]
Each x is doubled, assigned to n, and filtered by the condition.
Without :=, you’d need a separate loop or repeat x * 2.
Performance Note
In loops or comprehensions where the same operation is done multiple times, using := prevents recomputation, which can lead to measurable performance gains for expensive operations (e.g., API calls, regex, parsing).
Tools and Support
| Tool/Library | Notes |
|---|---|
| Flake8, pylint | May require updated plugins to support := |
| Black (formatter) | Properly formats walrus expressions |
| mypy (type checker) | Handles assignment expressions correctly |
| IDLE / VSCode | Syntax highlighting from Python 3.8+ |
Community Response
The walrus operator was one of the most debated additions in Python history (see PEP 572). While it improves conciseness, some developers feared it might lead to overly compact or “write-only” code. The consensus today is:
- ✅ Great when used sparingly and clearly
- 🚫 Avoid using it in deeply nested expressions or when clarity suffers
Summary
| Feature | Supported |
|---|---|
| Assignment inside condition | ✅ |
| Assignment in loops | ✅ |
| Inline reuse of values | ✅ |
| Use in function call args | ❌ |
| Use in lambdas | ❌ |
| Requires Python ≥ 3.8 | ✅ |
Conclusion
The Walrus Operator (:=) is a powerful addition to Python that enables more succinct and efficient code by combining assignment and evaluation. It shines in common patterns like:
- Input reading loops
- Conditional assignments
- List comprehensions with reusable expressions
- Regex and functional constructs
However, it’s important to use it judiciously—maintain code clarity and readability. When applied thoughtfully, the walrus operator is a clean, modern tool for Python developers.
Related Keywords
- Assignment Expression
- Boolean Condition
- Comprehension
- Expression Evaluation
- Input Loop
- Inline Assignment
- PEP 572
- Regex Matching
- Syntactic Sugar
- While Loop









