How to make empty list in initial attr of class?
oop, python
Solution
The `value` you are defining is not an instance field for your class, its more like a static field. But python doesn't mind if you access this field from instances. So, even if you access this field from instances, it is not a different list for each instance. Basically, you are appending to the same list every time the method is called.
You'll have to do this
class A(object):
def __init__(self):
self.value = []
def method(self, new_value):
self.value.append(new_value)
Now you have a different list created for each instance.
EDIT: Let me try to explain what happens when you use a `str`.
class A(object):
self.value = 'str'
def method(self):
self.value += '1'
That last line in the previous code is the same as this:
self.value = self.value + '1'
Now, this makes it abit easier to see what's going on. First, python gets the value from `self.value`. Since there is no instance field defined yet on `self`, this will give `'str'`. Add `'1'` to that and sets it to the instance field called `value`. This is like
self.value = 'str1'
which is the same as you'd set an instance field in the `__init__` method (in my first snippet of code).
self.value = []
Does that make it clear?
Problem
Here is a code: ``` >>> class A(object): ... value = [] ... def method(self, new_value): ... self.value.append(new_value) ... >>> a = A() >>> a.value [] >>> a.method(1) >>> b = A() >>> b.value [1] >>> b.method(2) >>> b.value [1, 2] >>> a.value [1, 2] ``` This happens only with lists. Is the only way to deffine value in __init__? How to normally define default class values in python? UPD thank you for your responses ``` >>> class B(object): ... value = "str" ... def method(self): ... self.value += "1" ... >>> a = B() >>> a.value 'str' >>> a.method() >>> a.value 'str1' >>> b = B() >>> b.value 'str' ``` I don't get, why list is shared but str is not?