Python 3中为什么将True和False更改为keywords

2024-06-10 01:06:45 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python 2中,我们可以重新分配TrueFalse(但不是None),但这三个(TrueFalseNone)都被视为内置变量。然而,在Py3k中,这三个词都按照the docs变成了关键字。

根据我自己的推测,我只能猜测,这是为了防止像this这样的恶作剧,这些恶作剧源自于古老的True, False = False, True恶作剧。然而,在Python2.7.5中,可能在之前,重新分配NoneNone = 3语句引发了SyntaxError: cannot assign to None

在语义上,我不相信TrueFalseNone是关键字,因为它们最终是语义上的文本,这正是Java所做的。我查看了PEP 0(索引),但找不到解释更改原因的PEP。

与python2中的None那样的文字或特殊大小写相比,使它们成为关键字是否有性能优势或其他原因?


Tags: thenonefalsetruedocs原因关键字语句
3条回答

主要有两个原因:

  1. 所以人们不会做隐藏在随机模块中的恶作剧。(德夫努尔解释)
  2. 因为关键字比全局内置的要快。在Python2.x中,解释器在使用这些变量之前必须解析它们的值,这比关键字慢一些。(见Why is if True slower than if 1?

可能是因为Python2.6不仅允许True = False,还允许您说一些有趣的事情,比如:

__builtin__.True = False

这将在整个过程中将True重置为False。它会导致非常有趣的事情发生:

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

编辑:正如Mike所指出的,Python wiki还在核心语言更改下声明如下:

  • 创建真关键字和假关键字。
    • 理由:让他们无法完成任务。

几个月前在python-dev上讨论过这个问题。 与非本地或带有语句doc的链接相反,拥有大量指向True定义的链接会很烦人。

我总结了为什么真假会让事情变得“更美好”。

  1. 作为循环内调用的函数的副作用重新绑定。

    很容易改变事实,例如:

    def True(): print True

  2. 对于让用户代码重新绑定内置名称None、True和False,没有什么好的用例,使它们成为关键字几乎只有plus。

  3. 使程序在每一步都要在符号表中查找“真”,才发现真的有值真的远非直观。(这就是为什么1比True快。)

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

    dis.dis(x)

          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(x)

          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

参考:

开始与指定真假相关的谈话:

一些辅助数据:

注:有些数字显示为真/1:

[alex@lancelot 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

[alex@lancelot 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

相关问题 更多 >