42

Python 2 では、Trueandを再代入できましFalseたが ( はできませんでしたNone)、3 つすべて ( TrueFalse、およびNone) は組み込み変数と見なされていました。ただし、Py3k では、3 つすべてがdocsに従ってキーワードに変更されました。

私自身の推測では、昔の悪ふざけに由来するこのような悪ふざけを防ぐためであるとしか推測できませんでしたTrue, False = False, True。ただし、Python 2.7.5 では、おそらくそれ以前は、None = 3which reassignedなどのステートメントで が発生しましNoneSyntaxError: cannot assign to None

True意味的には、 、False、およびがキーワードだとは思いませんNone。なぜなら、それらは最終的に意味的にリテラルであり、Java が行ったことだからです。PEP 0 (インデックス) を確認しましたが、変更された理由を説明する PEP が見つかりませんでした。

Noneリテラルやpython2のような特別なケースではなく、キーワードにするパフォーマンス上の利点やその他の理由はありますか?

4

3 に答える 3

11

主に次の 2 つの理由からです。

  1. __builtin__.True = Falseだから人々はランダムなモジュールに隠されたいたずらをしません. (devnull で説明)
  2. キーワードはグローバルビルトインよりも高速だからです。Python 2.x では、インタープリターはこれらの変数の値を使用する前に解決する必要があり、これはキーワードよりも少し遅くなります。( if True が if 1 よりも遅いのはなぜですか?を参照してください)
于 2013-08-11T22:12:13.370 に答える
3

これは、数か月前に python-dev で議論されました。True の定義へのリンクが大量にあると、たとえば非ローカルまたは with ステートメント doc へのリンクとは対照的に、煩わしくなります。

そして、True と False が物事を「さらに細かく」する理由を結論付けます。

  1. ループ内で呼び出される関数の副作用として再バインドされます。

    次のように True を変更するのは非常に簡単です。

    def True(): print True

  2. ユーザー コードが組み込みの名前である None、True、および False を再バインドできるようにする適切なユース ケースは実際にはありません。

  3. Makeプログラムは、Trueが値を持っていることを見つけるために、各ステップでシンボルテーブルで「True」を検索する必要があります。Trueは直感的ではありません。(そのため、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

参照:

True と False への代入に関する最初の話:

一部の補助データ:

PS: 一部の数字は True/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
于 2013-08-15T07:29:30.447 に答える