要素が一つのタプルとリストでの違い

普段からタプルとリストの違いといえば、初期値で固定か否かぐらいにしか意識していなかった。そのため意外な箇所でエラーになったので備忘録として残す。
(コードはpython3です。)

エラー事例

問題があったのは以下のコード

if num in (3):
    print("{}は3だよ".format(num))

1行目での条件分岐で指定の値が複数の値に含まれるか判別するコードだが、実装中に気がつけば要素が1つになっていることはよくあると思う。このコードは実行するとエラーになる。

>>> num = 3
>>> if num in (3):
...     print("{}は3だよ".format(num))
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: argument of type 'int' is not iterable

しかし、タプル"(3)"をリスト"[3]"にするとエラーにはならない

>>> num = 3
>>> if num in [3]:
...     print("{}は3だよ".format(num))
...
3は3だよ

なぜか?

初期化したタプルとリストの型を表示すると原因が分かった

>>> t = (1)
>>> a = [1]
>>> t.__class__.__name__
'int'
>>> a.__class__.__name__
'list'
>>> t2 = (1,2)
>>> t2.__class__.__name__
'tuple'

要素が一つのタプルは自動でint型として扱われる。要素が一つのリストはlist型のままだ。

普段からタプルとリストをもっと意識して使おう

メモpython

Posted by gm2bv