r/PythonLearning 4d ago

<python code>

Post image

This is python code to get student salary!

43 Upvotes

10 comments sorted by

u/Sea-Ad7805 3d ago

Run this program in Memory Graph Web Debugger%3A%0A%20%20%20%20%20%20%20%20self.name%20%3D%20name%0A%20%20%20%20%20%20%20%20self.age%20%3D%20age%0A%20%20%20%20%20%20%20%20self.salary%20%3D%20salary%0A%20%20%20%20%20%20%20%20self.marks%20%3D%20%5B%5D%0A%0A%20%20%20%20def%20average(self)%3A%0A%20%20%20%20%20%20%20%20return%20sum(self.marks)%20%2F%20len(self.marks)%0A%0A%0Aclass%20work(student)%3A%0A%20%20%20%20def%20init(self%2C%20name%2C%20age%2C%20salary)%3A%0A%20%20%20%20%20%20%20%20super().init(name%2C%20age%2C%20salary)%0A%0A%0Ayes%20%3D%20work(name%3D%22ali%22%2C%20age%3D27%2C%20salary%3D13.9)%0Aprint(yes.name)%0Ayes.marks.append(20)%0Ayes.marks.append(22)%0Aprint(yes.average())%0A&play) to see the program state change step by step.

3

u/Sea-Ad7805 4d ago

Maybe self.salary should be a property of worker not student, right? Each class should only have the properties it deals with, a worker has a salary, a student does not.

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.

3

u/CodeAndCanyons 4d ago edited 4d ago

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 []

2

u/IdeaOverflow 4d ago

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

1

u/notsaneatall_ 4d ago

It's the right way to initialize an empty list

2

u/Potential_Fix_5007 4d ago

1

u/Necessary_Pepper7111 4d ago

Because [] is an empty list

1

u/ziggittaflamdigga 4d ago

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.

1

u/IowU 1d ago

You should post the code on reddit formatted with markdown, not by posting screenshots. Other than that, are you asking for advice on how to improve it or are you asking for help with something?