3

通常、変数に値を割り当てて ID を確認すると、Python は基本的にオブジェクトに「名前」を付けているだけなので、それらが同じであることが期待されます。これは、次のコードで確認できます。

>>> a = 3
>>> id(a)
19845928
>>> id(3)
19845928

問題は、「name」で同じことを実行するときです

>>> __name__
'__main__'
>>> id(__name__)
19652416
>>> id('__main__')
19652448

ID が異なるのに、同じであってはならないのはなぜですか? __name__参考にもなるので。

4

4 に答える 4

5

id() は基本的に、データへのメモリ ポインタを提供します。文字列は不変ですが、インターンされることは保証されていません。これは、値が等しい一部の文字列が異なるポインタを持つことを意味します。

整数(特に小さいもの)の場合、ポインターは同じになるため、3例は正常に機能します。


@KartikAnand:「同じオブジェクト」をチェックする方法は有効ですが、通常はx is y. 問題は、それらが同じオブジェクトではなく、同じであることが保証されていないことです。それらは単に同じ値を持っています。"__main__"その際、新しいオブジェクトを作成していることに注意してください。ときどき、Python は適切な最適化を行い、以前に作成された同じ値の文字列を再利用しますが、そうする必要はありませ


Kartik の目標は、「割り当てが途中で参照され、オブジェクトがその場で作成されないことを確認する」ことです。これを行うには、新しいオブジェクトを作成しないようにします (文字列リテラルではありません)。

>>> __name__
'__main__'
>>> x = __name__
>>> id(__name__)
3078339808L
>>> id(x)
3078339808L
>>> __name__ is x
True
于 2012-05-17T16:03:52.947 に答える
4

2 つの文字列が同じ値を持っているからといって、それらが同じオブジェクトであるとは限りません。これは完全に予想される動作です。

于 2012-05-17T16:02:40.297 に答える
3

Python では、小さい整数は「プール」されるため、すべての小さい整数値は同じオブジェクトを指します。これは文字列には当てはまりません。

とにかく、これは依存すべきではない実装の詳細です。

于 2012-05-17T16:02:31.203 に答える
0

ここで実行しているのは、Python ではプリミティブが疑似 (または実際の) シングルトンであるという事実です。さらに、文字列がインターンされると、値と id が副作用として同義語になるため、文字列を見ると問題が曇ってしまいます。代わりに手作りのオブジェクトを見てみてください。そうすると、新しいインスタンスがいつ作成されるかを制御でき、ID と値がより明確になります。

于 2012-05-17T16:18:53.547 に答える