Литерал списка [...]
определяется грамматикой, так же как и ключевые слова, такие как 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
в качестве аргумента.