Почему 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?
Ответы
Ответ 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