I was writing a class in Python and there was a class variable that was supposed to be a copy of a global predefined list.
1 2 3 4 5 FOO = ['a', 'b', 'c'] class Test(object): def __init__(self): self.foo = FOO
At first everything was alright, until when there were multiple instances of the
Test class. The initial value of
self.foo was not constant, which came to my surprise since that variable is supposed to be initialised to
FOO during creation.
Then I realised I forgot about the difference between call by reference and value. In Python, doing
1 2 foo = ['a', 'b', 'c'] bar = foo
bar is just a pointer to
foo, so any changes done to
foo will be reflected in
bar or vice versa. If you want
bar to be separate, you need to make
bar a copy of
foo. The simplest way is as below:
1 bar = list(foo)
foo is a nested list, you will need to perform a deeper copy:
1 2 import copy bar = copy.deepcopy(foo)
This concept applies to most mutable objects as well, such as dictionaries and user defined classes.