Why do class methods share mutable defaults between instances?
Ron Teeter
ron.teeter at supplysolution.com
Tue Apr 30 18:11:37 EDT 2002
More information about the Python-list mailing list
Tue Apr 30 18:11:37 EDT 2002
- Previous message (by thread): Dictionary that adds items to itself
- Next message (by thread): Why do class methods share mutable defaults between instances?
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Greetings,
Today I made a rather perplexing discovery. It appears that mutable defaults
in class methods are shared between instances. Here is a simple example of
the scenario.
class Demo:
def __init__(self,name,dict={},list=[]):
self.name = name
self.dict = dict
self.list = list
self.dict[name] = name
self.list.append(name)
def dump(name,dict={},list=[]):
print name,dict,list
for name in ['A1','B1','C1']:
tmp = Demo(name)
dump(tmp.name,tmp.dict,tmp.list)
>>>
A1 {'A1': 'A1'} ['A1']
B1 {'B1': 'B1', 'A1': 'A1'} ['A1', 'B1']
C1 {'C1': 'C1', 'B1': 'B1', 'A1': 'A1'} ['A1', 'B1', 'C1']
>>>
My intent was that each time Demo was instanciated a new dictionary would be
assigned to 'dict' if there was no corresponding argument. However, the
behavior is as though the {} were replaced with a class constant.
In order to avoid this behavior I had to reorganize Demo as follows:
class Demo2:
def __init__(self,name,dict=None,list=None):
if dict==None:
dict = {}
if list==None:
list = []
self.name = name
self.dict = dict
self.list = list
self.dict[name] = name
self.list.append(name)
I am wondering if this is a bug or a subtle usage error on my part. I would
expect that syntax on functions would be valid for class methods as well, but
in this case you get drastically different behaviors.
Thanks,
Ron Teeter
- Previous message (by thread): Dictionary that adds items to itself
- Next message (by thread): Why do class methods share mutable defaults between instances?
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Python-list mailing list