[解決済み] TypeError: 'list' オブジェクトは Python で呼び出し可能ではありません。
質問
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つの大きなルールがあります。
-
名前空間 . Pythonは名前空間を入れ子にすることができます。理論的には、名前空間を無限に入れ子にすることができます。すでに述べたように、名前空間は基本的に名前とそれに対応するオブジェクトへの参照の辞書です。あなたが作成したモジュールは、それ自身の "global" 名前空間を取得します。実際には、それはその特定のモジュールに関するローカルな名前空間に過ぎません。
-
スコープ . 名前を参照すると、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セッションを開始すると、一時的なモジュールが作成されます。
関連
-
[解決済み] リストのリストからフラットなリストを作るには?
-
[解決済み] リスト内のアイテムのインデックスを検索する
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] リストが空かどうかを確認するにはどうすればよいですか?
-
[解決済み] Pythonのリストメソッドであるappendとextendの違いは何ですか?
-
[解決済み] 最小限の驚き」と「変更可能なデフォルトの引数
-
[解決済み] リストの最後の要素を取得する方法
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み] Spyderを仮想環境で動作させるには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Pythonです。未束縛のメソッドを束縛する?
-
[解決済み] PILからopenCVフォーマットへの変換
-
[解決済み] Flaskで1時間ごとに関数を実行するようにスケジュールするには?
-
[解決済み] googletransがエラー 'NoneType' オブジェクトに 'group' 属性がない、と言って動かなくなった。
-
[解決済み] PyMongoで.sortを使用する
-
[解決済み] オブジェクトのリストに特定の属性値を持つオブジェクトが含まれているかどうかをチェックする
-
[解決済み] djangoフレームワークでフォームフィールドから値を取得するには?
-
[解決済み] virtualenv の `--no-site-packages` オプションを元に戻す。
-
[解決済み] Pythonの文字列の前にあるbという接頭辞は何を意味するのですか?
-
[解決済み] データクラスとtyping.NamedTupleの主な使用例