Как списки создаются без имени класса? - PullRequest
1 голос
/ 01 апреля 2019

Можно создать такие списки:

l = list()

l.append(1)

, однако самый распространенный способ - создать список следующим образом:

l = [1]

Мой вопрос прост вконцепция, но, вероятно, чрезвычайно сложная в ответе, но как получается, что список создается с нотацией вне обычной нотации класса?

Я просмотрел исходный код на https://github.com/python/cpython/blob/master/Objects/listobject.c и не могу найтигде он определяет обозначение списка [].

Я не спрашиваю о разнице между [] и list () - я спрашиваю, почему вы можете использовать [] вообще.Как это возможно, что этот объект создан в отличие от других объектов?

Ответы [ 2 ]

3 голосов
/ 01 апреля 2019

Литерал списка [...] определяется грамматикой, так же как и ключевые слова, такие как if и while:

atom: ... | '[' [testlist_comp] '] | ...

Когда генератор кода встречает литерал списка в AST, он генерирует специальный байт-код для создания списка:

>>> import dis
>>> dis.dis('[]')
  1           0 BUILD_LIST               0
              2 RETURN_VALUE

, тогда как вызов list обрабатывается так же, как и любой другой вызываемый объект:

>>> dis.dis('list()')
  1           0 LOAD_NAME                0 (list)
              2 CALL_FUNCTION            0
              4 RETURN_VALUE

Для непустых списков выражения в литерале добавляются в стек для использования BUILD_LIST:

>>> dis.dis('list([1,2])')
  1           0 LOAD_NAME                0 (list)
              2 LOAD_CONST               0 (1)
              4 LOAD_CONST               1 (2)
              6 BUILD_LIST               2
              8 CALL_FUNCTION            1
             10 RETURN_VALUE

При вызове наподобие list([1,2]) обязательно сначала используется BUILD_LIST для создания списка перед передачей , которые - list в качестве аргумента.

1 голос
/ 01 апреля 2019

[1] является литералом списка - он неявно создает list() с 1 в нем (сохраняет его в куче).Я уверен, что вы можете найти это, если немного больше покопаться в кодовой базе.

...