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?
(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.
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