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

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

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

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

    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 = [] , она выполняется только один раз, поэтому в результате этой строки может быть создан только один список.

      Interesting Posts

      pip install: проверьте разрешения и владельца этого каталога

      Python – ввод пользователя для имени переменной, передаваемой в качестве аргумента функции

      Алгоритм экстракции фразы для статистического машинного перевода

      Результат SQLAlchemy для столбца UTF-8 имеет тип 'str', почему?

      Преобразование Pandas TimeDelta в целое число

      Динамическое поле выбора в моделях Django

      UnicodeEncodeError: кодек 'ascii' не может кодировать символ u '\ xa3'

      Самый простой способ создать градиент цвета на excel с помощью python / pandas?

      Выполнение подпроцесса python через git hook

      Общие библиотеки Python: RTLD_GLOBAL segfault

      Pythonic способ проверить, есть ли у двух словарей одинаковый набор ключей?

      Запись PySpark у исполнителя

      Как построить несколько графиков плотности на одном и том же рисунке в python

      Функции поливинов Openc в исключении python throws

      В чем разница между старым стилем и новыми классами стилей в Python?

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