1

これはPythonコードです。

for e in range(-10, 10):
    exec('x=%d'% e)
    exec('y=%d'% e)
    print e, id(x), id(y), x is y

printステートメントにはTrueのみが表示されると思いました。そうではありません。-5未満では、Falseを示します。

結果は

-10 38832080 38832056 False
-9 38832032 38832080 False
-8 38832056 38832032 False
-7 38832080 38832056 False
-6 38832032 38832080 False
-5 30857416 30857416 True
-4 30857392 30857392 True
-3 30857368 30857368 True
-2 30857344 30857344 True
-1 30857320 30857320 True
0 30857296 30857296 True
1 30857272 30857272 True
2 30857248 30857248 True
3 30857224 30857224 True
4 30857200 30857200 True
5 30857176 30857176 True
6 30857152 30857152 True
7 30857128 30857128 True
8 30857104 30857104 True
9 30857080 30857080 True

なぜexecは-5の下でxとyにそれぞれ異なるIDを割り当てるのですか?

4

2 に答える 2

1

これはcpython実装の詳細です。==整数が同じかどうかを確認するために使用する必要があります。驚くべきことは、cpythonが実際Trueにいくつかの整数を返すことです。

x = -5
y = -5
print x is y  #suprisingly prints `True` with cpython

これは、cpythonが効率のために小さな整数を「インターン」するためです。整数は不変の型であるため、これを行うことができます。文字列でも同じことをします。

于 2013-02-05T14:45:00.070 に答える
1

CPython は -5 から 256 までの小さな整数をキャッシュします。 PyInt_FromLongを参照してください:

現在の実装では、-5 から 256 までのすべての整数に対して整数オブジェクトの配列が保持されます。その範囲で int を作成すると、実際には既存のオブジェクトへの参照が返されます。

于 2013-02-05T14:47:23.653 に答える