переменные класса являются общими для всех экземпляров в 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