1

isPythonで使用して空の文字列をチェックするのは正しいですか?==同等性をテストしながら、IDチェックを行います。

次のことを考慮してください(使用するという考えはこの回答joinから借用しています):

>>> ne1 = "aaa"
>>> ne2 = "".join('a' for _ in range(3))
>>> ne1 == ne2
True
>>> ne1 is ne2
False
>>>

したがって、ここでisは期待どおりに機能します。次に、このコードを見てください。

>>> e1 = ""
>>> e2 = "aaa".replace("a", "")
>>> e3 = "" * 2
>>> e4 = "bbb".join(range(0))
>>> e1, e2, e3, e4
('', '', '', '')
>>> e1 is e2
True
>>> e1 is e3
True
>>> e1 is e4
True
>>> id(e1), id(e2), id(e3), id(e4)
(35963168, 35963168, 35963168, 35963168) # why?
4

4 に答える 4

15

空の文字列を確認する正しい方法は、次のとおりです。

if yourstring:
   print "string is not empty"

たとえば、文字列bool(yourstring)False空の場合です。あなたの例が機能する理由は、CPython が特定の文字列と整数をキャッシュし、効率のためにそれらを再利用するためです。これは実装の詳細であり、依存するべきではありません。

于 2012-09-04T12:30:55.830 に答える
8

Python の実装では、小さな文字列をインターンすることを選択する場合があります (実際には、不変のものをインターンすることを選択する場合があります)。Cpython はそうします。

この動作に依存するべきではありません。文字列が空の文字列かどうかを確認したい場合は、常に を使用してmystring == ""ください。

チェックしているオブジェクトが常に文字列であることが確実な場合は、ブール値のコンテキスト ( など) で評価することもできますが、これは空の文字列を、、またはif mystring:と区別しないことに注意してください。0FalseNone

于 2012-09-04T12:32:55.280 に答える
1

空のシーケンス(文字列、リスト、...)をチェックする最良の方法は次のとおりです。

if variable:
  pass

真理値テストから

次の値はfalseと見なされます。

空のシーケンス、たとえば、''、()、[]

比較に関するドキュメントもお読みください。

  • isアイデンティティを比較します
  • ==タイプに応じて同等性を比較します

文字列は、文字に相当する数値(組み込み関数ord()の結果)を使用して辞書式に比較されます。Unicodeと8ビットの文字列は、この動作で完全に相互運用可能です

于 2012-09-04T12:38:34.447 に答える
0

同じオブジェクトを指している場合、「is」演算子は true を返します。Python は文字列を繰り返さないようにします (この文字列が既にメモリに存在するかどうかをチェックします)。同じオブジェクトを返します。

文字列の比較に「is」は使用しません。これは Java の「==」演算子のようなもので、通常は機能しますが、新しいインスタンスを取得すると false が返される可能性があります。メソッドeqを呼び出し、両方の文字列が等しい場合、それらが異なるオブジェクトであっても True を返します。

于 2012-09-04T12:39:50.340 に答える