class variables is shared across all instances in

2019-01-03 16:58发布

This question already has an answer here:

I started coding in python a week ago, it is my mistake i started coding using oops,classes and objects that soon. I assumed my C++ proficiency will help.... I got bit by the following code

class A:
     var=0
     list=[]
     def __init__(self):
            pass

Here to my surprise, var and list are kinda global variable, it is shared across all instances it seems.... What I thought was it was different across all the instances..... It took me half a day to figure out that.... It does not make even slightest sense, that a variable can be accessed by a class object only, but is shared across all instances....... Just Curious, is there a reason behind it?????

4条回答
SAY GOODBYE
2楼-- · 2019-01-03 17:36

var should definitely not be shared as long as you access it by instance.var or self.var. With the list however, what your statement does is when the class gets evaluated, one list instance is created and bound to the class dict, hence all instances will have the same list. Whenever you set instance.list = somethingelse resp. self.list = somethingelse, it should get an instance level value.

Example time:

>>> class A():
...     var = 0
...     list = []
...
>>> a = A()
>>> b = A()
>>> a.var
0
>>> a.list
[]
>>> b.var
0
>>> b.list
[]
>>> a.var = 1
>>> b.var
0
>>> a.list.append('hello')
>>> b.list
['hello']
>>> b.list = ['newlist']
>>> a.list
['hello']
>>> b.list
['newlist']
查看更多
Emotional °昔
3楼-- · 2019-01-03 17:42

Note that you do not see this behaviour for var, you only see it for list:

>>> class A:
...     var = 0
...     list = []
... 
>>> a1 = A()
>>> a2 = A()
>>> a1.var = 3
>>> a2.var
0
查看更多
forever°为你锁心
4楼-- · 2019-01-03 17:44

The reason is that in Python class is an executable statement that is executed like any other. The body of the class definition is executed once, when the class is defined. If you have a line line var = [] in there, then it is only executed once, so only one list can ever be created as a result of that line.

查看更多
我想做一个坏孩纸
5楼-- · 2019-01-03 17:56

These are basically like static variables in Java:

// Example equivalent Java
class A {
    static int var = 0;
    static String[] list;
}

This is the intended behavior: Class variables are for the class.

For normal instance variables, declare them in the constructor:

class A:
    def __init__(self):
        self.var = 0
        self.list = []

You may want to look at Static class variables in Python.

查看更多
登录 后发表回答