Python Forum
Default values of arguments with the same id
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Default values of arguments with the same id
#1
class test:
    def __init__(self,val=[]):
        self.val=val

a=test()
b=test()
print(id(a.val)==id(b.val)) #True
I noticed that the default value of the arguments has the same id as other instances.
And by changing that value, it changes for other instances.
a.val+=[12]
print(b.val) # [12]
Is this normal for you?
Reply
#2
Ah, the good old mutable defaults...

https://python-forum.io/Thread-Basic-Var...on-Gotchas has an explanation of what's going on.
Search for "empty list".
Reply
#3
(Dec-02-2020, 02:16 PM)stranac Wrote: Ah, the good old mutable defaults...

https://python-forum.io/Thread-Basic-Var...on-Gotchas has an explanation of what's going on.
Search for "empty list".
Thank you for your answer.
According to you, I searched the internet.
And I used the following solution
class test:
    def __init__(self,val=None):
        if val==None:val=[]
        self.val=val
Writing the third line sounds a little silly but I have to.This reduces the readability of Python.
I think for other people with a different id is more useful than the same id.
Reply
#4
class test:
    def __init__(self,val=None):
        self.val = [] if val is None else val
I think "None" is the only default value that should be used for methods. When subclassing I kept running into problems with default arguments hiding that no value had been provided. In the example below I wanted b to "inherit" a's default value.
class a:
    def __init__(self, value=2):
        self.value = value

    def __repr__(self):
        return str(self.value)

class b(a):
    def __init__(self, value=None):  # Want superclass to provide default
        super().__init__(value)

print(b(), b(5))
Output:
None 5
The inheritance works if I use None in the method signature and set the value in the method body.
class a:
    def __init__(self, value=None):
        self.value = 2 if value is None else value

    def __repr__(self):
        return str(self.value)

class b(a):
    def __init__(self, value=None):  # Want superclass to provide default
        super().__init__(value)

print(b(), b(5))
Output:
2 5
DrVictor likes this post
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  What data types can I use for default values? Mark17 1 536 Oct-09-2023, 02:07 PM
Last Post: buran
  Function with many arguments, with some default values medatib531 3 2,602 Mar-14-2020, 02:39 AM
Last Post: medatib531
  Function Default Arguments grkiran2011 7 3,741 Aug-09-2018, 11:12 AM
Last Post: grkiran2011
  Functions (Arguments Passing,Changing a mutable ,Assignment to Arguments Names) Adelton 2 3,872 Mar-02-2017, 10:23 PM
Last Post: zivoni

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020