[解決済み] なぜ(0-6)は-6=偽なのか?重複
疑問点
重複の可能性があります。
Pythonの "is "演算子は整数で予期せぬ振る舞いをします。
今日、私は自分のプロジェクトをデバッグしようとし、数時間の分析の後、私はこれを得ました。
>>> (0-6) is -6
False
が、しかし
>>> (0-5) is -5
True
なぜなのか、説明していただけませんか? もしかしたら、これは何らかのバグか、非常に奇妙な動作かもしれません。
> Python 2.7.3 (default, Apr 24 2012, 00:00:54) [GCC 4.7.0 20120414 (prerelease)] on linux2
>>> type(0-6)
<type 'int'>
>>> type(-6)
<type 'int'>
>>> type((0-6) is -6)
<type 'bool'>
>>>
どのように解決するのですか?
5 から 256 までのすべての整数は、CPython と同じアドレスを共有するグローバルオブジェクトとしてキャッシュされます。
is
のテストはパスします。
このアーティファクトの詳細については http://www.laurentluce.com/posts/python-integer-objects-implementation/ で、現在のソースコードを確認することができます。 http://hg.python.org/cpython/file/tip/Objects/longobject.c .
小さな整数を参照し、共有することでアクセスが高速になるように、特定の構造体が使用されています。これは、整数オブジェクトへの262のポインタの配列です。これらの整数オブジェクトは初期化時に、上で見た整数オブジェクトのブロックに割り当てられています。小整数の範囲は-5から256までです。多くのPythonプログラムはこの範囲の整数を使う時間が長いので、これは賢い判断です。
これはCPythonの実装の詳細に過ぎず、これに依存してはいけません。
例えば
PyPy
を実装した
id
は自分自身を返すために整数の
(0-6) is -6
は、たとえ内部的に異なるオブジェクトであっても常に真となります。また、この整数キャッシュを有効にするかどうか、さらに下限と上限の設定も可能です。しかし一般に、異なる起源から取得されたオブジェクトは同一ではないでしょう。もし、同一性を比較したいのであれば、単に
==
.
関連
-
[解決済み] 割り当て後にリストが予期せず変更されました。その理由と防止策を教えてください。
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] なぜlist.join(string)ではなくstring.join(list)なのでしょうか?
-
[解決済み] Pythonのクラスはなぜオブジェクトを継承するのですか?
-
[解決済み] なぜPythonのコードは関数の中でより速く実行されるのですか?
-
[解決済み】なぜPythonはこのJSONデータをパースできないのですか?[終了] PythonがこのJSONデータをパースできないのはなぜですか?
-
[解決済み】PyPyが6.3倍速いなら、CPythonよりPyPyを使うべきじゃないのか?
-
[解決済み] 2つのデータフレームをマージしようとすると、ValueErrorが発生します。
-
[解決済み] Python のモック patch.object を使って、他のメソッド内で呼び出されたメソッドの戻り値を変更する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 「is" 演算子が整数に対して予期せぬ振る舞いをする。
-
[解決済み] Djangoで2つの日付の間を選択する
-
[解決済み] Pythonで0xを使わずにhex()を使うには?
-
[解決済み] PyQtアプリケーションのスレッド化。QtスレッドとPythonスレッドのどちらを使うか?
-
[解決済み] IPythonの終了確認を無効にする
-
[解決済み] TypeError: can't multiply sequence by non-int of type 'float'」と表示されるのはなぜですか?
-
[解決済み] python BeautifulSoup テーブルのパース
-
[解決済み] ネストした辞書の項目からpandasのDataFrameを構築する
-
[解決済み] ne__は__eq__の否定として実装されるべきか?
-
[解決済み] readonlyプロパティをmockでモックするには?