pythonコード`if not x:`と`if x is not None:`と`if not x is None:`使用

2990 ワード

コードには常に変数がNoneかどうかの判断があり、3つの主な書き方があります.
一つ目は`if x is None`;
2つ目は`if not x:`;
3つ目は`if not x is None`(このように理解すると`if not(x is None)`)です.
このように書くのに何の違いもないと思ったら、気をつけてください.この中に穴があります.まずコードを見てみましょう.
>>> x = 1
>>> not x
False
>>> x = [1]
>>> not x
False
>>> x = 0
>>> not x
True
>>> x = [0]         # You don't want to fall in this one.
>>> not x
False

pythonでNone,False,空の文字列",0,空のリスト[],空の辞書{},空のメタグループ()はFalseに相当します.
not None == not False == not '' == not 0 == not [] == not {} == not ()

したがって、リストを使用する場合、x=[]とx=Noneの2つを区別したい場合は、`if not x:`に問題が発生します.
>>> x = []
>>> y = None
>>> 
>>> x is None
False
>>> y is None
True
>>> 
>>> 
>>> not x
True
>>> not y
True
>>> 
>>> 
>>> not x is None
>>> True
>>> not y is None
False
>>> 
xがNoneかどうかを判断したいのかもしれませんが、`x=[]`の場合も判断してしまう場合は区別できません.
if not xという書き方に慣れているpythonerでは、xがNone,False,空文字列",0,空リスト[],空辞書{},空メタグループ()に等しい場合、あなたの判断に影響しないことを明らかにしなければなりません. 
`if x is not None`と`if not x is None`の書き方については、前者の方がはっきりしていることが明らかですが、後者は読者に`if(not x)is None`と誤解される可能性があるので、前者をお勧めします.
結論:
`if x is not None`は最も良い書き方で、はっきりしていて、間違いが発生しないで、後でこのような書き方を堅持します.
if not xという書き方を使う前提は、xがNone,False,空文字列",0,空リスト[],空辞書{},空メタグループ()に等しい場合、あなたの判断に影響しないことを明確にしなければならないことです.
================================================================
ただし、これは変数が関数である場合には適用されません.以下は転載します.https://github.com/wklken/stackoverflow-py-top-qa/blob/master/contents/qa-control-flow.md
foo is Noneとfoo==Noneの違い
質問リンク
if foo is None: pass
if foo == None: pass

同じオブジェクトインスタンスを比較すると、isは常にTrueを返し、==最終的には「eq()」に依存します.
>>> class foo(object):
    def __eq__(self, other):
        return True

>>> f = foo()
>>> f == None
True
>>> f is None
False

>>> list1 = [1, 2, 3]
>>> list2 = [1, 2, 3]
>>> list1==list2
True
>>> list1 is list2
False

さらに
(ob1 is ob2)     (id(ob1) == id(ob2))

################################################################################
補足、2013.10.09
転入先http://zhidao.baidu.com/question/514056244.html
pythonのnotは具体的に何を表しているのか、例を挙げて、心から感謝します.
 python not      ,     True False,not True False,not False True,        not   :
(1) not      if  ,  not       False   ,         。  :
a = False
if not a:   (    a False,  not a  True)
    print "hello"
         hello
(2)               ,if a not in b,a   ,b      ,         a    b ,            ,  :
a = 5
b = [1, 2, 3]
if a not in b:
    print "hello"
         hello
not x               if x is false, then True, else False