2016-07-15 5 views
1

私は混乱しています。文字列のタプルは "比較"が一貫して動作しません

foo = ("empty", 0) 
foo[0] is "empty" 

戻り値False。これは "list"も失敗するため、キーワード文字列の問題と思われます。 "empt"と他の文字列が真を返します。これは、fooがリストであるかのように、コードが真を返すかのように、タプルでのみ起こるようです。

これをpython 3.4.3とpython 3.5でテストしましたが、どちらもこのように動作します。この問題はありますが、期待どおりに真を返します。

python3のタプルにいくつかの標準がありませんか?私はこの問題をgoogle-fooにしようとしましたが、手短かになっています。

編集: 物事をクリアするには、私の正確な質問はFalseの理由ん

foo = ("empty", 0) 
foo[0] is "empty" 

リターンが、

foo = ("empt", 0) 
foo[0] is "empt" 

リターン本当ですか?

+2

文字列を比較しています*。なぜあなたは '=='ではなく 'is'を使うことに決めましたか? –

+1

2つは文字通り同じオブジェクトではないので、これは 'が'テストしているものです。彼らは* equalです。* – kindall

+0

't =(" list "、); t [0]は "list"で、 'False'に評価され、' t =( "notlist"、); t [0]は "notlist"から "True"になります。私はこれが質問の核心だと思う。 – mhoff

答えて

0

を読む:あなたはアイデンティティで文字列を比較している、これは失敗する可能性があります。文字列リテラルのアイデンティティに関する仮定はできません。

しかし、実際には微妙な問題が見つかりました。

>>> t = ("list",); t[0] is "list" 
False 
>>> t = ("notlist",); t[0] is "notlist" 
True 
>>> t = ("list",) 
>>> id(t[0]) 
140386135830064 
>>> id("list") 
140386137208400 
>>> t[0] is "list" 
False 
>>> l = ("notlist",) 
>>> id(l[0]) 
140386135830456 
>>> id("notlist") 
140386135830456 
>>> l[0] is "notlist" 
True 
# interestingly, this works: 
>>> ("list",)[0] is "list" 
True 

(パイソン3.5.1+インタラクティブシェルでテスト済み)

これははっきりPythonのいくつかの成分、おそらくレクサー又はパーサによって実装依存挙動です。

ボトムライン:オブジェクトの同一性に依存しない限り、文字列比較には==を使用してください。

+0

あなたは正しく仮定します。 '(" list "、)[0]は" list "も真であると期待する理由はありません。インタプリタは、各リテラルに対して個別のオブジェクトを自由に割り当てることができます。 – chepner

+0

"微妙な問題" - いいえ、問題ではありません。 Pythonはこの動作が違反するという約束をしていません。 – user2357112

+0

あなたはこの行動のより良い言葉をお持ちですか?私はこれが違反ではないことを知っています。しかし、それは非常に直感的ではありません。* pythonキーワードを含む文字列*は特別なものではないようです。 – mhoff

0

isでリテラル値を使用すると、ほぼ確実に実装依存の結果が得られます。 Pythonがシングルトンであることが保証されている唯一のリテラルはNoneです。他のリテラルは、既存のオブジェクトへの参照を解決することも解決しないこともあります。通訳者は、重複した値を「認識」し、それを表現するために同じ基礎となるオブジェクトを使用すると想定することはできません。

関連する問題