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

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

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

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

  • pyodbc - Как выполнить оператор select с использованием переменной для параметра
  • Передача переменной строки в LIKE в SQLite (Python)
  • Назначить действие переменной в Automator для использования в Shell Script
  • 4 Solutions collect form web for “переменные класса являются общими для всех экземпляров в python?”

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

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

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

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

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

    Python - лучший язык программирования в мире.