переменные класса являются общими для всех экземпляров в python? [дубликат]

этот вопрос уже есть ответ здесь:

Я начал кодировать в python неделю назад, это моя ошибка, я начал кодировать с помощью oops, классов и объектов, которые скоро. Я предположил, что мое знание C++ поможет.... Я укусила следующие код

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

здесь, к моему удивлению, var и list являются своего рода глобальной переменной, она разделяется во всех экземплярах.... То, что я думал, было по-разному во всех случаях..... Мне потребовалось полдня, чтобы понять это.... Нет ни малейшего смысла в том, что переменная может быть доступна только объекту класса, но является общей для всех экземпляров....... Просто любопытно, есть ли причина?????

4 ответов


var определенно не следует делиться, пока вы получаете к нему доступ с помощью instance.var или self.var. Однако в list ваш оператор делает следующее: Когда класс оценивается, создается один экземпляр list и привязывается к классу dict, поэтому все экземпляры будут иметь один и тот же список. Всякий раз, когда вы установите instance.list = somethingelse респ. self.list = somethingelse, он должен получить значение уровня экземпляра.

пример:

>>> 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']

они в основном похожи на статические переменные в Java:

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

это предполагаемое поведение: переменные класса являются класс.

для обычных переменных экземпляра объявите их в конструкторе:

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

Вы можете посмотреть статические переменные класса в Python.


причина в том, что в Python class представляет собой исполняемый оператор, который выполняется, как и любой другой. Тело определения класса выполняется один раз, когда класс определен. Если у вас есть строка var = [] там, то он выполняется только один раз, поэтому только один список может быть создан в результате этой строки.


обратите внимание, что вы не видите это поведение для var, только list:

>>> class A:
...     var = 0
...     list = []
... 
>>> a1 = A()
>>> a2 = A()
>>> a1.var = 3
>>> a2.var
0