文字列をスペースと比較すると、 'is'演算子の動作が異なります

ルイスダニエル:

私はPython(python 3.3)の学習を開始し、is演算子を試していました私はこれを試しました:

>>> b = 'is it the space?'
>>> a = 'is it the space?'
>>> a is b
False
>>> c = 'isitthespace'
>>> d = 'isitthespace'
>>> c is d
True
>>> e = 'isitthespace?'
>>> f = 'isitthespace?'
>>> e is f
False

スペースと疑問符isが異なる動作をするようです。どうしたの?

編集:私はを使用する必要があることを==知っていますが、なぜisこのように動作するのかを知りたかっただけです。

Elazar:

警告:この回答は、特定のPythonインタープリターの実装の詳細に関するものです。文字列をis==悪い考えと比較する

まあ、少なくともcpython3.4 / 2.7.3の場合、答えは「いいえ、空白ではありません」です。空白だけでありません

  • 2つの文字列リテラルは、英数字であるか、同じブロック(ファイル、関数、クラス、または単一のインタープリターコマンド)に存在する場合、メモリを共有します

  • 文字列に評価される式は、定数と2項/単項演算子を使用して作成され、結果の文字列が21文字より短い場合に限り、文字列リテラルを使用して作成されたものと同じオブジェクトになります。

  • 単一の文字は一意です。

英数字の文字列リテラルは常にメモリを共有します:

>>> x='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
>>> y='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
>>> x is y
True

英数字以外の文字列リテラルは、囲んでいる構文ブロックを共有する場合に限り、メモリを共有します。

(通訳)

>>> x='`!@#$%^&*() \][=-. >:"?<a'; y='`!@#$%^&*() \][=-. >:"?<a';
>>> z='`!@#$%^&*() \][=-. >:"?<a';
>>> x is y
True 
>>> x is z
False 

(ファイル)

x='`!@#$%^&*() \][=-. >:"?<a';
y='`!@#$%^&*() \][=-. >:"?<a';
z=(lambda : '`!@#$%^&*() \][=-. >:"?<a')()
print(x is y)
print(x is z)

出力:TrueおよびFalse

単純なバイナリ演算の場合、コンパイラーは非常に単純な定数伝播(peephole.cを参照)を実行しますが、文字列の場合は、結果の文字列が21文字より短い場合にのみ実行されます。この場合、前述のルールが有効になります。

>>> 'a'*10+'a'*10 is 'a'*20
True
>>> 'a'*21 is 'a'*21
False
>>> 'aaaaaaaaaaaaaaaaaaaaa' is 'aaaaaaaa' + 'aaaaaaaaaaaaa'
False
>>> t=2; 'a'*t is 'aa'
False
>>> 'a'.__add__('a') is 'aa'
False
>>> x='a' ; x+='a'; x is 'aa'
False

もちろん、単一の文字は常にメモリを共有します:

>>> chr(0x20) is ' '
True

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Cでのチルダ演算子クエリの動作が異なります

分類Dev

strsplit()は、文字列の最初と最後にスペースがあると動作が異なります

分類Dev

'instanceof'演算子は、インターフェイスとクラスでは動作が異なります

分類Dev

「as」演算子の予期しない動作、プレーンキャストとは異なります

分類Dev

クロスメタ演算子を使用すると、** 2と²の動作が異なるのはなぜですか?

分類Dev

+演算子はJavaの数値と文字列でどのように異なる動作をしますか?

分類Dev

+ =演算子が+とは異なる動作をし、Python辞書に演算子を割り当てるのはなぜですか?

分類Dev

Bash:2つの文字列をスペースと比較します

分類Dev

Java-if-else演算子と3項演算子の動作が異なる

分類Dev

difftime +減算演算子を使用すると、エラー「オリジンを指定する必要があります」が異なる分動作しません

分類Dev

VIM:ドット演算子の動作が異なるのはなぜですか?

分類Dev

三項演算子を使用したES6.some()の動作は異なります

分類Dev

OR演算子は、2つの異なる動作を引き起こします

分類Dev

文字列と記号の動作が異なりますか?

分類Dev

この場合、「if-else」が三項演算子「?:」と異なる動作をするのはなぜですか?

分類Dev

JavaScriptの「削除」演算子がブラウザごとに異なる動作をするのはなぜですか?

分類Dev

ヌル条件演算子が==と.Equals()で異なる動作をするのはなぜですか?

分類Dev

new演算子は()演算子は、デフォルトコンストラクタの有無に応じて削除されます)(削除したときに動作が異なります

分類Dev

スペース-列/行が単一の場合、ChromeとFirefoxで動作が異なります

分類Dev

ハードコードされた文字列と比較して、コマンドからの出力を出力するときのbashの動作が異なります

分類Dev

Python文字列:文字列の最後のバックスペースの動作が異なります

分類Dev

リストの削除と除外の動作が異なります

分類Dev

ADLの演算子関数の動作が他の関数と異なるのはなぜですか?

分類Dev

負の整数のモジュロ演算子(%)の動作がCとRubyで異なるのはなぜですか?

分類Dev

RxJSの共有演算子は、完了すると異なる動作をしますか?

分類Dev

CakePHP: "IN"-演算子は単一の値と複数の値で異なる動作をします

分類Dev

リストする文字列。動作が異なりますか?

分類Dev

文字列をエスケープ文字と比較する

分類Dev

リストのノードを文字列配列と比較する

Related 関連記事

  1. 1

    Cでのチルダ演算子クエリの動作が異なります

  2. 2

    strsplit()は、文字列の最初と最後にスペースがあると動作が異なります

  3. 3

    'instanceof'演算子は、インターフェイスとクラスでは動作が異なります

  4. 4

    「as」演算子の予期しない動作、プレーンキャストとは異なります

  5. 5

    クロスメタ演算子を使用すると、** 2と²の動作が異なるのはなぜですか?

  6. 6

    +演算子はJavaの数値と文字列でどのように異なる動作をしますか?

  7. 7

    + =演算子が+とは異なる動作をし、Python辞書に演算子を割り当てるのはなぜですか?

  8. 8

    Bash:2つの文字列をスペースと比較します

  9. 9

    Java-if-else演算子と3項演算子の動作が異なる

  10. 10

    difftime +減算演算子を使用すると、エラー「オリジンを指定する必要があります」が異なる分動作しません

  11. 11

    VIM:ドット演算子の動作が異なるのはなぜですか?

  12. 12

    三項演算子を使用したES6.some()の動作は異なります

  13. 13

    OR演算子は、2つの異なる動作を引き起こします

  14. 14

    文字列と記号の動作が異なりますか?

  15. 15

    この場合、「if-else」が三項演算子「?:」と異なる動作をするのはなぜですか?

  16. 16

    JavaScriptの「削除」演算子がブラウザごとに異なる動作をするのはなぜですか?

  17. 17

    ヌル条件演算子が==と.Equals()で異なる動作をするのはなぜですか?

  18. 18

    new演算子は()演算子は、デフォルトコンストラクタの有無に応じて削除されます)(削除したときに動作が異なります

  19. 19

    スペース-列/行が単一の場合、ChromeとFirefoxで動作が異なります

  20. 20

    ハードコードされた文字列と比較して、コマンドからの出力を出力するときのbashの動作が異なります

  21. 21

    Python文字列:文字列の最後のバックスペースの動作が異なります

  22. 22

    リストの削除と除外の動作が異なります

  23. 23

    ADLの演算子関数の動作が他の関数と異なるのはなぜですか?

  24. 24

    負の整数のモジュロ演算子(%)の動作がCとRubyで異なるのはなぜですか?

  25. 25

    RxJSの共有演算子は、完了すると異なる動作をしますか?

  26. 26

    CakePHP: "IN"-演算子は単一の値と複数の値で異なる動作をします

  27. 27

    リストする文字列。動作が異なりますか?

  28. 28

    文字列をエスケープ文字と比較する

  29. 29

    リストのノードを文字列配列と比較する

ホットタグ

アーカイブ