Jupyter Notebookを使っていて実際にあったこと。
何も考えずに
list = [1, 2, 3, 4, 5]
みたいなリストを既に作っていた。で、それとは別に
hoge = [1, 1, 1, 2, 2, 3]
みたいなリストの要素を重複がないようにして取り出したくなった。しかも、インデックスで要素を参照したい。
そういう時には一度set型にしてからlist型にまた戻せば良いのだろうということで
list(set(hoge))
を打ったら
TypeError: 'list' object is not callable
となる。listを変数名にしたのが悪いらしい。もちろん最初からやり直して変数名をlistではないようにすればいいのだが、既に重い計算をしていたのでJupyter NotebookをRestartしたくない。そういう時は
del list
すればよい。こうするとlistというリストは消えてくれるので、
list(set(hoge))
すれば、ちゃんと
[1, 2, 3]
が返ってくる。めでたしめでたし。
ちょっと考えてみると、他にも
max = 5
みたいな変数名にしてしまうと、
max(2, 4)
TypeError: 'int' object is not callable
となる。こういう時にも
del max
すればよいのである。
まとめると・・・
len()
や max()
のような組み込み関数(公式ドキュメント参照)と同じ名称の変数を設定してしまうと、その変数は呼び出しができない(not callable)オブジェクトなのでエラーになる。そういう時は del
文を使って変数をなかったことにすればよい。
まあ、そもそも組み込み関数と同じ名称の変数なんて作らないのがベストである。
ちなみに・・・
これは完全に余興だが、組み込み関数と同じ名称の呼び出し可能なオブジェクトを設定してもエラーにならないようである。例えば abs()
は引数の絶対値を返す関数だが、同じ名称の
def abs(n):
return n * 5
という関数を設定すると、関数は呼び出し可能なのでエラーにはならず、abs(-1) = -5
となってしまう。また、本当はクラス名を小文字から始めるのはルール違反だが、
class abs:
def __init__(self, n):
self.n = n
def speak(self):
print(str(self.n) + "の絶対値はよくわかりません。")
とすると、クラスも同様に呼び出し可能なのでエラーにはならず、
abs(-1).speak()
-1の絶対値はよくわかりません。
ということが出来てしまう。