質問

is と2つの文字列を比較しようとしています。 1つの文字列は関数によって返され、もう1つの文字列は比較で宣言されています。 はオブジェクトIDをテストしますが、このページによると、 Pythonのメモリ最適化のため、2つの同一の文字列でも機能します。しかし、以下は機能しません:

def uSplit(ustring):
        #return user minus host
        return ustring.split('!',1)[0]

user = uSplit('theuser!host')
print type(user)
print user
if user is 'theuser':
    print 'ok'
else:
    print 'failed'

user = 'theuser'

if user is 'theuser':
    print 'ok'

出力:

type 'str'
theuser
failed
ok

この理由は、関数によって返される文字列が異なる「タイプ」であると推測しています文字列リテラルよりも文字列の。とにかく文字列リテラルを返す関数を取得する方法はありますか? == を使用できることは知っていますが、興味があります。

役に立ちましたか?

解決

引用するサイトには次のように記載されています:

  

2つの文字列リテラルが等しい場合、それらは同じメモリ位置に配置されています。

しかし

uSplit('theuser!host')

は文字列リテラルではありません-リテラル 'theuser!host' に対する操作の結果です。

とにかく、通常は is を使用して文字列の同等性をチェックするべきではありません。なぜなら、このメモリ最適化は、あなたが依存すべきでない実装の詳細に過ぎないからです。


また、 is None などの場合は is を使用する必要があります。これを使用して、設計したクラスの2つのオブジェクトが同じインスタンスであるかどうかを確認します。これらの組み込みクラスの作成規則は複雑であるため、文字列または数値に簡単に使用することはできません。一部の文字列はインターンされます。同様に、いくつかの数値は抑留されています。

他のヒント

引用したページには、「2つの文字列 literals が等しい場合、それらは同じメモリロケーションに配置されています」と表示されます。 (強調鉱山)。 Pythonはリテラル文字列をインターンしますが、任意の関数から返される文字列は個別のオブジェクトです。 is 演算子はポインター比較と見なすことができるため、2つの異なるオブジェクトは同じものとして比較されません(同じ文字が含まれている場合、つまり等しい場合でも)。

あなたが遭遇したのは、Pythonが常にすべての文字列をインターンするとは限らないという事実です。詳細はこちら:

http://mail.python.org/pipermail/tutor /2009-July/070157.html

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top