Подтвердить что ты не робот

Почему True и False изменились на ключевые слова в Python 3

В Python 2 мы могли бы переназначить True и False (но не None), но все три (True, False и None) считались встроенными переменными. Однако в Py3k все трое были изменены на ключевые слова документы.

Из моих собственных предположений я мог только догадываться, что это должно было предотвратить использование махинаций, таких как , которые вытекают из старой True, False = False, True шутки. Однако в Python 2.7.5 и, возможно, раньше, такие выражения, как None = 3, которые переназначили None, подняли SyntaxError: cannot assign to None.

Семантически, я не верю, что True, False и None являются ключевыми словами, поскольку они, наконец, являются семантически литералами, что и сделала Java. Я проверил PEP 0 (индекс), и я не смог найти PEP, объяснив, почему они были изменены.

Есть ли преимущества в производительности или другие причины для того, чтобы сделать их ключевыми словами, а не литералами или специальными оболочками, такими как None в python2?

4b9b3361

Ответ 1

Возможно, потому что Python 2.6 не только разрешил True = False, но и разрешил вам говорить такие смешные вещи, как:

__builtin__.True = False

который будет reset True до False для всего процесса. Это может привести к действительно смешным вещам:

>>> import __builtin__
>>> __builtin__.True = False
>>> True
False
>>> False
False
>>> __builtin__.False = True
>>> True
False
>>> False
False

EDIT: Как указано Mike, Python wiki также указывается следующее в разделе Изменения основного языка:

  • Сделать правдивые и ложные ключевые слова.
    • Причина: сделать назначение невозможным.

Ответ 2

По двум причинам, главным образом:

  • Таким образом, люди не делают прикол __builtin__.True = False, скрытый на случайном модуле. (как показано exnull)
  • Потому что ключевые слова быстрее, чем глобальные встроенные. В Python 2.x интерпретатор должен будет решить эти значения переменных перед их использованием, что немного медленнее, чем ключевые слова. (см. Почему это, если True медленнее, чем 1?)

Ответ 3

Это обсуждалось несколько месяцев назад на python-dev. Наличие тонны ссылок на определение Истины будет раздражать, в отличие от ссылок на, например, нелокальные или с утверждениями doc.

И все, что я делаю, почему True и False делают вещи "еще более прекрасными".

  • переопределяется как побочный эффект функций, вызываемых внутри цикла.

    Очень просто изменить True, например:

    def True(): print True

  • На самом деле нет хорошего варианта использования для того, чтобы пользовательский код перепроверял встроенные имена None, True и False, поэтому их ключевые слова имеют почти только плюсы.

  • Сделать программу нужно искать "True" в таблице символов на каждом шаге только для того, чтобы найти True. Значение True далека от интуитивного. (поэтому 1 быстрее, чем True).

    x = compile ('while 1: foop()', '', 'exec')

    dis.dis(х)

          0 SETUP_LOOP              19 (to 22)
          3 JUMP_FORWARD             4 (to 10)
          6 JUMP_IF_FALSE           11 (to 20)
          9 POP_TOP
    >>   10 LOAD_NAME                0 (foop)
         13 CALL_FUNCTION            0
         16 POP_TOP
         17 JUMP_ABSOLUTE           10
    >>   20 POP_TOP
         21 POP_BLOCK
    >>   22 LOAD_CONST               1 (None)
         25 RETURN_VALUE
    

x = compile ('while True: foop()', '', 'exec')

dis.dis(х)

          0 SETUP_LOOP              19 (to 22)
    >>    3 LOAD_NAME                0 (True)
          6 JUMP_IF_FALSE           11 (to 20)
          9 POP_TOP
         10 LOAD_NAME                1 (foop)
         13 CALL_FUNCTION            0
         16 POP_TOP
         17 JUMP_ABSOLUTE            3
    >>   20 POP_TOP
         21 POP_BLOCK
    >>   22 LOAD_CONST               0 (None)
         25 RETURN_VALUE

ссылка

Начало разговора, связанное с назначением True и False:

некоторые данные Aux:

PS: некоторое число показывает True/1:

[[email protected] test]$ timeit.py -c -s'import itertools as it' 'c=it.count()'
'while True:' '  if c.next()>99: break'
10000 loops, best of 3: 91 usec per loop

[[email protected] test]$ timeit.py -c -s'import itertools as it' 'c=it.count()'
'while 1:' '  if c.next()>99: break'
10000 loops, best of 3: 76 usec per loop