u/Potential_Fix_5007 You accidentally dodged one of the absolute biggest footguns in Python by doing it inside the body!
If you tried to set it within the round brackets as a default argument—like writing def __init__(self, name, age, marks=[]):—Python does something incredibly sneaky under the hood. It evaluates that default empty list [] exactly once when the script first loads, not every time you create a new student.
Because lists are mutable (changeable), every single student object you create would end up sharing the exact same list instance in memory. If you appended a grade to Alice's marks, it would suddenly and mysteriously show up in Bob's marks too.
By defining self.marks = [] inside the __init__ body, you guarantee that a brand new, isolated list gets allocated in memory every single time a new student is instantiated.
If you ever do want to allow a list to be passed through the round brackets safely, the standard pythonic trick is to default it to None and handle it in the body:
```python
def init(self, name, age, marks=None):
self.name = name
self.age = age
self.marks = marks if marks is not None else []
You should not initialize an empty list inside of the round brackets directly. Suppose you do it like this:
class Student:
def __init__(self, marks=[]):
self.marks = marks
a = Student()
b = Student()
a.marks.append(3)
print(a.marks) # prints [3]
print(b.marks) # prints [3]
Python will not create a new list for every new object but use the same one for each, since default arguments are evaluated at compile time. The correct way to do this would be:
class Student:
def __init__(self, marks=None):
self.marks = [] if marks is None else marks
That’s a fair question to ask about default behaviors, especially since lists can be weird in Python; setting an empty list as a default argument to a constructor is bad practice and likely to result in bugs.
So asking “why” here is a legitimate question and requires an explanation of how Python works at the C level that OP is probably not looking for, but would be different if they declared it differently.
2
u/Potential_Fix_5007 4d ago
self.marks=[]
Is this the right way to create an empty list for an object value or is there a way to set it within the round brackets?
Im a beginner myself and so far i learned if you want to set a default value you donit within the brackets.