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

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

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

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

Ответы

Ответ 1

var определенно не будет использоваться до тех пор, пока вы получите доступ к нему instance.var или self.var. Однако со списком, что делает ваш оператор, когда класс оценивается, создается один экземпляр списка и привязывается к классу 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']

Ответ 2

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

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

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

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

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

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

Ответ 3

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

Ответ 4

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

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