Self reference in Python - Time & Space Complexity
Start learning this pattern below
Jump into concepts and practice - no test required
When a function calls itself, it uses self reference, also called recursion. Understanding how long this takes helps us know if the code will run fast or slow as input grows.
We want to find out how the number of steps grows when the function keeps calling itself.
Analyze the time complexity of the following code snippet.
def countdown(n):
if n <= 0:
return
countdown(n - 1)
This function calls itself with a smaller number until it reaches zero, counting down step by step.
- Primary operation: The function calls itself once each time with n reduced by 1.
- How many times: It repeats this call n times until it reaches zero.
Each time the function calls itself, it does one step less until it stops.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 calls |
| 100 | 100 calls |
| 1000 | 1000 calls |
Pattern observation: The number of steps grows directly with n, so doubling n doubles the work.
Time Complexity: O(n)
This means the time it takes grows in a straight line with the input size.
[X] Wrong: "Since the function calls itself, it must be very slow and take exponential time."
[OK] Correct: Here, the function calls itself only once each time, so the steps add up linearly, not multiply.
Understanding how self reference affects time helps you explain recursive solutions clearly and confidently in real coding situations.
"What if the function called itself twice each time? How would the time complexity change?"
Practice
self represent inside a Python class method?Solution
Step 1: Understand the role of
selfin classesselfis used to refer to the current object instance inside class methods.Step 2: Differentiate from other options
It is not a global variable, decorator, or keyword but a conventional name for the instance parameter.Final Answer:
The current instance of the class -> Option BQuick Check:
self= current object [OK]
- Thinking self is a keyword
- Confusing self with class itself
- Assuming self is optional
self in a Python class?Solution
Step 1: Recall method definition syntax in Python classes
Instance methods must includeselfas the first parameter to access instance data.Step 2: Check each option
Onlydef method(self):correctly includesselfas the first parameter.Final Answer:
def method(self): -> Option AQuick Check:
Method needs self parameter [OK]
- Omitting self parameter
- Using wrong parameter name like cls or this
- Confusing class and instance methods
class Counter:
def __init__(self):
self.count = 0
def increment(self):
self.count += 1
return self.count
c = Counter()
print(c.increment())
print(c.increment())Solution
Step 1: Understand the initial state and method behavior
WhenCounteris created,countis 0. Eachincrementadds 1 and returns the new value.Step 2: Trace the two calls to
First call: count goes 0 -> 1, returns 1. Second call: count goes 1 -> 2, returns 2.increment()Final Answer:
1 2 -> Option AQuick Check:
Increment adds 1 each call [OK]
- Assuming count resets each call
- Confusing return values
- Ignoring self reference updates
class Person:
def __init__(name):
self.name = name
p = Person('Alice')
print(p.name)Solution
Step 1: Check method parameters
The__init__method must haveselfas the first parameter to refer to the instance.Step 2: Identify the error
Here,__init__only hasname, soselfis missing, causing a runtime error.Final Answer:
Missing self parameter in __init__ -> Option CQuick Check:
__init__ needs self first [OK]
- Forgetting self in __init__
- Trying to use self without defining it
- Assuming self is automatic
Node for a linked list where each node refers to itself and the next node. Which is the correct way to set the next node using self reference?class Node:
def __init__(self, value):
self.value = value
self.next = None
def set_next(self, next_node):
???Choose the correct line to replace
???.Solution
Step 1: Understand attribute assignment with self
To update the current object'snextattribute, useself.next.Step 2: Match the correct assignment
Assigningself.next = next_nodecorrectly sets the next node reference.Final Answer:
self.next = next_node -> Option DQuick Check:
Use self.attribute = value to update instance data [OK]
- Assigning to local variable instead of self attribute
- Mixing attribute names
- Forgetting self in assignment
