4

一目でわかるように編集しているコードがいくつかあり、すべてを に変更する必要があると考えchar=="|"ましたchar is "|"。私はそれを弱めすぎているように見えることを知っていますが、見た目は良くなっています。とにかく、pycheck最後にもう 1 回決めたところ、次の警告が表示 されました。

Warnings...

test.py:7: Using is |, may not always work
Processing module test (test.py)...

私の人生では、マルチバイト文字エンコーディングや CJK 文字などに挑戦し始めない限り、"|" is "|"いつ戻ってくるか想像できません. 私が見逃した他の状況はありますか?False

4

3 に答える 3

13

==両側の値が等しいisかどうかをチェックしますが、両方の変数が同じ参照を指しているかどうかをチェックします。したがって、両者はまったく異なる目的のためのものです。例えば、

a = "aa"
b = "aa"
print a, b, id(a), id(b)
print a == b
print a is b

私のマシンでの出力

aa aa 140634964365520 140634964365520
True
True

abは同じ文字列データを指しているため (Python では文字列は不変です)、python は同じオブジェクトを使用するように最適化します。そのためis、 と==両方が戻ってきTrueます。一方

a = "aa"
b = "aaa"[:2]
print a, b, id(a), id(b)
print a == b
print a is b

私のマシンでの出力

aa aa 139680667038464 139680667014248
True
False

aとは同じデータ (等しいb) を持ちますが、メモリ内では異なる場所 (異なる参照または 2 つの異なるオブジェクト) に格納されます。

したがって、演算子を使用して等しいかどうかを確認しないでください。is

于 2013-11-11T06:13:15.777 に答える
7

CPython では、すべての単一文字列がインターンされ、同じ文字列 (文字) に対して常に同じ ID を持つ必要があります。

これは単なる実装の詳細であり、依存するべきではありません。

2 つの文字列の ID が同じであることを確認したい場合がいくつかありますが、ユース ケースはそれらの 1 つではありません。

Python 2.7.2 (1.9+dfsg-1, Jun 19 2012, 23:23:45)
[PyPy 1.9.0 with GCC 4.7.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
And now for something completely different: ``"let's not be obscure, unless we
really need to"''
>>>> a = "|"
>>>> a is "|"
False
于 2013-11-11T06:21:54.973 に答える