1. ホーム
  2. python

[解決済み] TypeError: 'list' オブジェクトは Python で呼び出し可能ではありません。

2023-06-13 16:18:02

質問

Pythonの初心者で、チュートリアルに沿っています。の例があります。 list の例があります。

example = list('easyhoss')

さて、チュートリアルでは example= ['e','a',...,'s'] . しかし、私の場合、以下のエラーが発生します。

>>> example = list('easyhoss')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable

私が間違っている場所を教えてください。私は、SOを検索しました この で検索しましたが、違っていました。

どのように解決するのですか?

組み込み名をシャドウイングしたようです。 list で、そのインスタンスを指している同じ名前のクラスを指しています。以下はその例です。

>>> example = list('easyhoss')  # here `list` refers to the builtin class
>>> list = list('abc')  # we create a variable `list` referencing an instance of `list`
>>> example = list('easyhoss')  # here `list` refers to the instance
Traceback (most recent call last):
  File "<string>", line 1, in <module>
TypeError: 'list' object is not callable

これはかなり明白なことだと思います。Pythonはオブジェクト名(関数やクラスもオブジェクトです)を名前空間(辞書として実装されています)に格納するので、どのスコープでもほとんどどんな名前でも書き換えることができます。だから、どんなスコープでも、どんな名前でも書き換えることができる。しかも、それが何らかのエラーになることはない。ご存知のように、Pythonは "特殊なケースはルールを破るほど特殊ではない" ということを強調しています。そして、あなたが直面した問題の背後には、2つの大きなルールがあります。

  1. 名前空間 . Pythonは名前空間を入れ子にすることができます。理論的には、名前空間を無限に入れ子にすることができます。すでに述べたように、名前空間は基本的に名前とそれに対応するオブジェクトへの参照の辞書です。あなたが作成したモジュールは、それ自身の "global" 名前空間を取得します。実際には、それはその特定のモジュールに関するローカルな名前空間に過ぎません。

  2. スコープ . 名前を参照すると、Pythonランタイムはその名前を(参照元である)ローカルの名前空間で調べ、そのような名前が存在しない場合は、より高いレベルの名前空間でその試行を繰り返します。このプロセスは、上位の名前空間がなくなるまで続けられます。その場合 NameError . 組み込み関数やクラスは特別な高階の名前空間である __builtins__ . という名前の変数を宣言すると list という名前の変数をモジュールのグローバル名前空間で宣言すると、 インタープリタは決してその名前を上位の名前空間で検索しません (つまり __builtins__ ). 同様に、あなたが変数 var を作成し、さらに別の変数 var をモジュール内で使用します。そして、もしあなたが var を参照すると、決してグローバルな var があるため、グローバルな var があるため、インタープリタは他の場所でそれを検索する必要がありません。

ここに簡単な図解があります。

>>> example = list("abc")  # Works fine
>>> 
>>> # Creating name "list" in the global namespace of the module
>>> list = list("abc")
>>> 
>>> example = list("abc")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable
>>> # Python looks for "list" and finds it in the global namespace,
>>> # but it's not the proper "list".
>>> 
>>> # Let's remove "list" from the global namespace
>>> del list
>>> # Since there is no "list" in the global namespace of the module,
>>> # Python goes to a higher-level namespace to find the name. 
>>> example = list("abc")  # It works.

というわけで、Pythonの組み込み関数には特別なものはないことがおわかりいただけたと思います。そして、あなたのケースは普遍的なルールの単なる一例です。このようなエラーを避けるためには、ネームシャドウイングをハイライトするIDE(例えばPyCharmのフリー版やPythonプラグインのあるAtomなど)を使用した方がよいでしょう。

callable"とは何かと疑問に思うかもしれませんが、その場合、次のように読むことができます。 この投稿 . list はクラスであるため、呼び出し可能です。クラスを呼び出すと、インスタンスの構築と初期化が行われます。インスタンスも同様に呼び出し可能かもしれませんが list インスタンスはそうではありません。もしあなたがクラスとインスタンスの区別にさらに困惑しているのなら、次の本を読んでみてください。 のドキュメントを読んでみてください。 (を読んでみてください(非常に便利なことに、同じページで名前空間とスコープをカバーしています)。

組み込み関数についてもっと知りたい場合は、以下の回答を読んでください。 クリスチャン ディーン .

P.S. 対話的なPythonセッションを開始すると、一時的なモジュールが作成されます。