5

私はいくつかのコードをテストしていました

True = 2
print 1 - (1 == 1)
print True == (1 == 1)

それから私は期待していました:

-1
True

しかし、代わりにこれを得ました:

0
False

そこで、Python プログラマーなら誰でもすること、つまり逆アセンブルを行いました。

def f():
    True = 2
    print 1 - (1 == 1)
    print True == (1 == 1)

2           0 LOAD_CONST               1 (2)
            3 STORE_FAST               0 (True)

3           6 LOAD_CONST               2 (1)
            9 LOAD_CONST               2 (1)
           12 LOAD_CONST               2 (1)
           15 COMPARE_OP               2 (==)
           18 BINARY_SUBTRACT     
           19 PRINT_ITEM          
           20 PRINT_NEWLINE       

4          21 LOAD_FAST                0 (True)
           24 LOAD_CONST               2 (1)
           27 LOAD_CONST               2 (1)
           30 COMPARE_OP               2 (==)
           33 COMPARE_OP               2 (==)
           36 PRINT_ITEM          
           37 PRINT_NEWLINE       
           38 LOAD_CONST               0 (None)
           41 RETURN_VALUE        

それから、それは少し明確でしたCOMPARE_OP (==). Witch はブール値を返す必要がありますが、代わりに整数を返すようです。理由はありますか?

編集:

つまり、学んだ教訓は次のとおりです。True または False の値を変更しても、ブール論理が舞台裏でどのように表現されるかは変わりません。

4

5 に答える 5

4

Python では、boolは のサブクラスでありint、 およびFalseはそれぞれ および とTrue同等の値を0持ち1ます。また、__eq__()好きなオブジェクトを返すことができます。組み込み型の場合、たまたまboolインスタンスが返されます。

于 2013-01-15T06:22:11.090 に答える
3

あなたの誤解はTrue、変数のように扱うと実際にブール演算の結果が変わると考えていたようです。そうではありません。 Trueデフォルトでは、ブール値の真実を表すために使用されますが、値を変更するとその機能が失われます。ただし、ブール値が整数に関してどのように扱われるかについての規則は変わりません。

于 2013-01-15T06:26:03.773 に答える
3

質問に対する Ashwini Chaudhary のコメントは、物事が期待どおりに機能しない理由を理解するための鍵だと思います。

Python のブール演算子は通常、 orの値ではなくbool(1)orを返します。Python 2 では、とはそれぞれとにバインドされている名前にすぎません。名前を別の値 ( など) に再バインドしても、比較からの戻り値は変更されず、そのままです。bool(0)TrueFalseTrueFalsebool(1)bool(0)True2bool(1)

Python 3 では、この問題は名前TrueFalseキーワードを作成することで回避されているため、新しい値に再バインドすることはできません。

于 2013-01-15T06:33:59.747 に答える
2
>>> True = 2

ここで に割り当て2ますTrue。したがってTrue、モジュールのスコープは実際には次の2とおりです。

>>> print(True)
2

1 == 1ですTrueTrue等しい1です。

>>> 1 - (1 == 1)
0

上記のように、そうでない理由を尋ねることができます2。さて、Truevariable は2モジュールのスコープ内でequal であり(1==1)、 real への参照 (タグ) を返すだけTrueです。に等しい1==1実数なので、に等しいです。True11 - (1 == 1)0


>>> print True == (1 == 1)
False

ここ1 == 1でも real への参照を返しますTrue。しかし、True式の最初の部分の はモジュールのスコープからのものであるため、実際には2. したがって、この式は事実上2 == (True)に等しくなりFalseます。

于 2013-01-15T06:28:16.097 に答える
1

ブール値から整数を差し引くと、その整数表現が使用されます。のサブクラスであるためint

int(True)であり11-1どちらが であるかがわかります0

また、-1ブール値True(「Falsey」値ではない)であるため、答えとしても正確ではないことを期待しています:

>>> -1 == True
False
>>> -1 == False
False
>>> bool(-1)
True
于 2013-01-15T06:22:43.303 に答える