@ゲー単走部

ローグライク雑記。変愚蛮怒、DCSSなど。

Python3で引っかかるところ~print関数~

リスト内包表記の中にprint書けたりするの気持ち悪すぎでしょ。
純粋関数型言語でない以上、戻り値なしで副作用しかない関数も通常の関数として扱えるわけで、
その意味でprintを文としておくのは一貫性がないということで関数にしたんだろうけど。

>>>p = [print(n) for n in range(5)]
0
1
2
3
4
>>>p
[None, None, None, None, None]
>>>print(p)
[None, None, None, None, None]
>>>print( [print(n) for n in range(5)] )
0
1
2
3
4
[None, None, None, None, None]

p = [print(n) for n in range(5)] なのに、

  • print(p) と
  • print( [print(n) for n in range(5)] )

で挙動違うの気持ち悪すぎ。
何で?

<追記>
記事を投稿してから冷静に考え直してみれば、挙動違うの当たり前だった。
リスト内包表記の中にprint書けるのは気持ち悪いが・・・

  • p = [print(n) for n in range(5)]
    • print関数を5回適用して、[None, None, None, None, None]を変数pに代入する
  • print(p)
    • リストpを表示するだけ
  • print( [print(n) for n in range(5)] )
    • print関数を5回適用して、[None, None, None, None, None]を表示する


だから何もおかしいところはなかった。

p = [print(n) for n in range(5)] が、実質2つの副作用を持っているのに、1行にまとまっているのがわかりにくかった。
変数pにはただリストが代入されてるだけなんだよね、printの処理は代入されない。