Die Verwendung eines Attributs einer Funktion als statische Variable hat einige potenzielle Nachteile:
- Jedes Mal, wenn Sie auf die Variable zugreifen wollen, müssen Sie den vollständigen Namen der Funktion ausschreiben.
- Externer Code kann leicht auf die Variable zugreifen und den Wert verändern.
Idiomatisches Python für das zweite Problem wäre wahrscheinlich, die Variable mit einem führenden Unterstrich zu benennen, um zu signalisieren, dass auf sie nicht zugegriffen werden soll, während sie nach der Tat zugänglich bleibt.
Verwendung von Verschlüssen
Eine Alternative wäre ein Muster, das lexikalische Abschlüsse verwendet, die mit dem nonlocal
Schlüsselwort in Python 3.
def make_counter():
i = 0
def counter():
nonlocal i
i = i + 1
return i
return counter
counter = make_counter()
Leider kenne ich keine Möglichkeit, diese Lösung in einem Dekorator zu kapseln.
Verwendung eines internen Zustandsparameters
Eine weitere Option könnte ein undokumentierter Parameter sein, der als Container für veränderbare Werte dient.
def counter(*, _i=[0]):
_i[0] += 1
return _i[0]
Das funktioniert, weil die Standardargumente bei der Definition der Funktion ausgewertet werden und nicht erst beim Aufruf der Funktion.
Sauberer wäre es, wenn man statt der Liste einen Containertyp hätte, z. B.
def counter(*, _i = Mutable(0)):
_i.value += 1
return _i.value
aber mir ist kein eingebauter Typ bekannt, der den Zweck eindeutig angibt.
33 Stimmen
Es gibt NO Gleichwertigkeit, fürchte ich. Selbst wenn man den Decorator-Hack mit Funktionsattributen durchführt, kann man auf die Variable von außen zugreifen, was den Sinn der Sache leider zunichte macht. Außerdem müssen Sie den Funktionsnamen in der Funktion hart codieren, was sehr ärgerlich ist. Ich würde vorschlagen, stattdessen globale Variablen einer Klasse oder eines Moduls zu verwenden, mit der konventionellen
_
Vorwahl.17 Stimmen
Für Nicht-C-Programmierer, [ [stackoverflow.com/questions/5033627/](https://stackoverflow.com/questions/5033627/static-variable-inside-of-a-function-in-c#5033656](a "static variable inside of a function in c%235033656%5d(a") statische Variable innerhalb einer Funktion ist nur innerhalb des Funktionsbereichs dieser Funktion sichtbar, aber ihre Lebensdauer ist die gesamte Lebensdauer des Programms, und sie wird nur einmal initialisiert). Im Grunde genommen handelt es sich um einen dauerhaften Zähler oder eine Speichervariable, die zwischen Funktionsaufrufen lebt.
2 Stimmen
@lpapp: Irgendwie schon, es ist ein Klassenmitglied . Sie haben Recht, dass wir nicht verhindern können, dass andere Codes sie anzeigen oder ändern.
0 Stimmen
Ich fand respuesta gegeben von Claudiu nützlich.