Глобальная переменная в классе, совместно используемая другим экземпляром - PullRequest
2 голосов
/ 08 января 2020

Мне нужно объяснение по поводу кода ниже

class Test():
    a_variable = []

    def add(self, value):
        self.a_variable.append(value)

    def print(self):
        print(self.a_variable)

a = Test()
b = Test()

a.add(1)
b.print()

Вывод

[1]

Вопросы:

  1. Это нормально?
  2. Почему a_variable поделился с другим экземпляром?
  3. Есть ли какая-либо документация по этому поводу?

Примечание: Я использую python 3.7.4 в моем среда и работает на Windows 10

1 Ответ

4 голосов
/ 08 января 2020

Обычно, когда вы пытаетесь установить атрибут класса с помощью экземпляра, вы создаете атрибут объекта, который затеняет атрибут класса. Например, если вы сделаете следующее:

def add(self, value):
    self.a_variable = value

Вы получите:

a.print() напечатает 1

b.print() напечатает []

Используя .append(), вы получаете ссылку на атрибут класса (то есть Test.a_variable) и мутируете его. Вот почему это отражается на всех экземплярах класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...