73945


こんにちは。Python(Cython)に関する質問です。

とあるPython(Cythonのようです)のコードの中に以下のようなif文を見つけました。

[code]

        def hoge(self, fuga):
            cdef # 中略
    
            if self.piyo == NULL: return
                # 処理1
    
            if self.piyo is NULL: return None
                # 処理2
    
[/code]

処理1の中には`self.piyo`を変化させるような処理は含まれていないものとします。

ここで２つのifが書かれている意味について考えています。  
これは単なる重複でしょうか？それともなにか違いや意図がありますでしょうか？  
Pythonに詳しくないのでやや漠然とした質問です。

よろしくおねがいします。


CC BY-SA 4.0
2021-02-12T00:56:05.707
73942
2021-02-12T03:52:10.220
2021-02-12T03:51:04.953
32772
32772
question
python cython
Python(Cython)の `== NULL` と `is NULL`, `return` と `return None` の違いについて


### `==` と `is` について

`xobj is yobj`  
… このような式は [式 (expression) /
比較](https://docs.python.org/ja/3/reference/expressions.html#comparisons) の
[同一性の比較](https://docs.python.org/ja/3/reference/expressions.html#is-not)
に記されています。

同じ実体(オブジェクト)を指しているかどうかを判定するので

  * `==` での比較だと, (仮に)巨大なオブジェクト(例えば異様に長い文字列とか) だった場合, すべてが等しいか調べるために(少し)時間がかかります。`is` なら同じオブジェクトを指しているかどうかの判定なので高速です
  * 同じオブジェクトなのに中身が異なることは(比較の瞬間は)ありません (なので `is` で同じなら当然 `==` と言える, はず)

なので比較の順番としては, 先に `is` で判定すべき  
(NULL は Pythonでは使われてないはずなので, 「とあるコード」で定義してるのでしょう)

* * *

### 戻り値に関して

以下はすべて同じものを返します

  * return
  * return None
  * (return なしで抜けた場合)

ただ目的(意味合い？)が異なります。  
例えば○○を見つけて返す処理ならば, 見つからなかった場合「存在しない」ことを示す `return None` と記述するほうが好ましい。  
どれか適当に返す処理, であれば, データがなかったら `return` だけとか, 普通に処理を抜けて良いでしょう (その関数の処理内容,
目的による)。あるいは値を返す必要が全く無い場合も同様


CC BY-SA 4.0
2021-02-12T03:52:10.220
73945
2021-02-12T03:52:10.220
43025
73942
answer