что происходит в list_2 Python? - PullRequest
0 голосов
/ 15 января 2020
 name = 'Guido'

 class MyClass:
     name = 'Raymond'
     list_1 = [name] * 3
     list_2 = [name for i in range(3)]

     @classmethod
     def hello(cls):
       return '{} says hello'.format(name)

Если я это сделаю? он печатает следующее:

>>> print(MyClass.hello())
Guido says hello
>>> print(MyClass.list_1) 
['Raymond', 'Raymond', 'Raymond']
>>> print(MyClass.list_2)
['Guido', 'Guido', 'Guido']

Мой вопрос здесь:

  1. Почему он не печатает «Раймонд» вместо «Гвидо» на 3-м выходе.
  2. Как заставить его печатать как:

    Рэймонд здоровается

1 Ответ

6 голосов
/ 15 января 2020

Python предоставляет два различных вида дисплеев (синтаксис, который вы можете неофициально называть литералом) для определения списка.

list_1 - это «обычный» дисплей списка, и использует самое последнее связанное значение для name.

list_2 определяется с использованием понимания списка, которое реализуется с использованием анонимной функции. Теперь name - свободная переменная в этой функции, и поэтому она преобразуется в значение name в ближайшей области видимости. Поскольку оператор class не устанавливает sh новую область, то это будет глобальная область, , а не временное пространство имен, установленное оператором class.

Старайтесь избегать используя атрибуты class в качестве «локальных» переменных в вашем определении класса.

Если в методе класса вы хотите, чтобы name был атрибутом класса, а не глобальной переменной, вам нужно явно указать:

@classmethod
def hello(cls):
    return '{} says hello'.format(<b>cls.</b>name)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...