In der Wenn Sie REPL verwenden, tritt möglicherweise der Fehler „TypeError: ‚list‘-Objekt ist nicht aufrufbar“ auf, wenn Sie versuchen, der Beispielvariable eine Liste zuzuweisen, indem Sie Folgendes verwenden Code:
example = list('easyhoss')
Dieses Problem tritt auf, weil die in Python integrierte Namensliste, die auf eine Klasse verweist, durch die Erstellung einer Variablen mit demselben Namen überschattet wurde. Diese Variable zeigt auf eine Instanz der Listenklasse.
Um diese Schattenbildung zu veranschaulichen:
>>> example = list('easyhoss') # 'list' refers to the builtin class >>> list = list('abc') # Create a variable 'list' referencing an instance of 'list' >>> example = list('easyhoss') # 'list' now refers to the instance Traceback (most recent call last): File "<string>", line 1, in <module> TypeError: 'list' object is not callable
Da Python Objekte (einschließlich Funktionen und Klassen) anhand ihres Namens in Namespaces referenziert, können Sie diese umschreiben Name in beliebigem Umfang. Die Laufzeit sucht im lokalen Namespace nach dem Namen und geht, wenn er nicht gefunden wird, zu Namespaces höherer Ebene über. Dieser Vorgang wird fortgesetzt, bis der Name gefunden wird oder ein NameError ausgelöst wird.
Builtins, wie z. B. die Liste, befinden sich im höherwertigen Namespace __builtins__. Wenn die Variablenliste im globalen Namensraum eines Moduls deklariert ist, sucht der Interpreter nicht in __builtins__ danach. Wenn in ähnlicher Weise eine Variable var innerhalb einer Funktion erstellt wird und eine andere Variable im globalen Namespace definiert wird, bezieht sich die Referenzierung der Variable aus der Funktion immer auf die lokale Variable.
Zum Beispiel:
>>> example = list("abc") # Works fine >>> >>> # Creating variable "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 finds "list" in the global namespace, >>> # but it is not the desired "list". >>> >>> # Remove "list" from the global namespace >>> del list >>> # Since "list" is no longer in the global namespace, >>> # Python searches in a higher-level namespace. >>> example = list("abc") # Works now
Daher folgen Python-Builtins denselben Regeln wie alle anderen Objekte. Shadowing, wie in diesem Fall dargestellt, kann durch die Verwendung einer IDE vermieden werden, die Namens-Shadowing-Probleme hervorhebt.
Außerdem ist die Liste als Klasse aufrufbar. Der Aufruf einer Klasse löst den Aufbau und die Initialisierung einer Instanz aus. Während eine Instanz auch aufrufbar sein kann, ist dies bei Listeninstanzen nicht der Fall. Klassen und Instanzen sind deutlich unterschiedliche Konzepte, die in der Python-Dokumentation erläutert werden.
Das obige ist der detaillierte Inhalt vonWarum löst „example = list(...)' einen „TypeError: ‚list'-Objekt ist nicht aufrufbar' aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!