Почему Python использует ".0" для представления итератора в разобранном байт-коде? - PullRequest
0 голосов
/ 23 марта 2020

Рассмотрим этот пример

>>> dis.dis("[1 for i in range(3)]")
  1           0 LOAD_CONST               0 (<code object <listcomp> at 0x10d6045d0, file "<dis>", line 1>)
              2 LOAD_CONST               1 ('<listcomp>')
              4 MAKE_FUNCTION            0
              6 LOAD_NAME                0 (range)
              8 LOAD_CONST               2 (3)
             10 CALL_FUNCTION            1
             12 GET_ITER
             14 CALL_FUNCTION            1
             16 RETURN_VALUE

Disassembly of <code object <listcomp> at 0x10d6045d0, file "<dis>", line 1>:
  1           0 BUILD_LIST               0
              2 LOAD_FAST                0 (.0)    <------ Look at this ??
        >>    4 FOR_ITER                 8 (to 14)
              6 STORE_FAST               1 (i)
              8 LOAD_CONST               0 (1)
             10 LIST_APPEND              2
             12 JUMP_ABSOLUTE            4
        >>   14 RETURN_VALUE

В разобранном байт-коде есть странный .0.

Анализируя каждую инструкцию, я знаю, что она представляет итератор iter(range(3)), но почему Python не использует более интуитивное представление, например iter(range(3)), поскольку оно уже знает свое значение?

1 Ответ

1 голос
/ 23 марта 2020

Это имя переменной. Сгенерированная функция для понимания списка принимает один аргумент, которому присваивается обычно запрещенное имя .0, чтобы убедиться, что имя не соответствует sh с любыми регулярными переменными. Если бы Python нужно было генерировать больше имен, они бы go .1, .2, et c.

Выход dis показывает .0, потому что инструкция LOAD_FAST чтение из переменной .0. dis не собирается go искать выражение, из которого получено значение переменной; это было бы большой дополнительной работой, вообще не было бы возможно, и было бы менее верным байт-коду, который он разбирает.

...