2016-07-10 7 views
2

私のテストコードでは、なぜタプルとNoneの結果がprintで異なるのですか? a、bは同じオブジェクトNoneを指していますが、c、dは異なるオブジェクトを指していますが、その値は同じです(両方とも(a,b)に等しい)。Pythonでは、Noneは一意のオブジェクトですか?

私は背後に横たわっているのではなくオブジェクトのisキーワードをチェックしたばかり==のような値とを比較することを知っています。そしてここで私はタプルが不変であると思うので、タプルを使用します。少なくとも、オブジェクトが可変であるか不変であるかは問題ではありません。

しかし、なぜ変数、bはcと二つの異なるNoneオブジェクトに作成し、ポイントはありません、タプルしてくださいdは?

a=None 
b=None 
c=(1,2) 
d=(1,2) 
print(a is b) 
print(c is d) 

答えて

4

Noneはシングルトンオブジェクトである:それのインスタンスは1つだけ存在し、これまでできます。 Noneを参照するオブジェクトが常に同じIDを持つことになりますし、そのようなオブジェクトの2つ以上は、常にアイデンティティ(オブジェクトの等価性)テストに合格しますよう:

>>> a = None 
>>> b = None 
>>> c = None 
>>> a is b is c 
True 

同じことがTrueFalse

>>> d = True 
>>> (a is b is c) is d # proof of concept only 
True 
+0

念のために、シングルトンオブジェクトのためにあなたは、None、TrueとFalse、基本的には 'is'と' == '仕事全く同じように言いましたか?ありがとうBTW。 – Nicholas

+1

ブール値の場合、真偽値と偽値を持つオブジェクトとしてテスト(またはオブジェクト自体)に '=='を使用すれば十分です。 'c = 1'は' c == True'を渡します( 'if c:...'のように直接cを使う方が良いですが 'cは真'ではありません)。アイデンティティをチェックしようとする場合にのみ 'is'を使用するように注意してください。 –

+0

待ってください。' 'aがbであるときはいつ' '(a is b)がcであるか '私はそれが通常の比較演算子にしか適用されないと考えました。 **編集:** ' '' で 'AB' abc''」内には、有効なすぎ – Eric

6

None object is a singleton in python.したがって、結果。

cdため、それは別のタプルを作成するのに対し。あなたの例から

>>> id(None) 
4454442584 
>>> id(a) 
4454442584 
>>> id(b) 
4454442584 
>>> id(c) 
4463917464 
>>> id(d) 
4463865584 
2

に適用されます'is'演算子は、あなたが把握した変数の背後にあるオブジェクトを比較します。

a=None 
b=None 
print(a is b) 
>True #both None are the same instanciations or objects 

Pythonでなしオブジェクトシングルトン(https://docs.python.org/2/c-api/none.html)であり、したがって、シングルトン1つのオブジェクト(https://en.wikipedia.org/wiki/Singleton_pattern)にクラスのインスタンスを制限します。

関連する問題