807 Stimmen

Was ist die Python-Entsprechung von statischen Variablen innerhalb einer Funktion?

Was ist die idiomatische Python-Entsprechung für diesen C/C++-Code?

void foo()
{
    static int counter = 0;
    counter++;
    printf("counter is %d\n", counter);
}

Wie implementiert man das statische Mitglied auf der Funktionsebene, im Gegensatz zur Klassenebene? Und ändert sich etwas, wenn man die Funktion in eine Klasse einordnet?

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.

10voto

Dave Punkte 9913
\_counter = 0
def foo():
   global \_counter
   \_counter += 1
   print 'counter is', \_counter

Python verwendet üblicherweise Unterstriche, um private Variablen zu kennzeichnen. Der einzige Grund in C, die statische Variable innerhalb der Funktion zu deklarieren, ist, sie außerhalb der Funktion zu verstecken, was in Python nicht wirklich idiomatisch ist.

10voto

warvariuc Punkte 53231

Ein wenig lesbarer, aber ausführlicher (Zen von Python: explizit ist besser als implizit):

>>> def func(_static={'counter': 0}):
...     _static['counter'] += 1
...     print _static['counter']
...
>>> func()
1
>>> func()
2
>>>

Siehe aquí für eine Erklärung, wie das funktioniert.

0 Stimmen

Können Sie näher erläutern, warum dieser Code funktioniert? Die zweite foo() sollte das Wörterbuch mit dem in der Funktionsdefinition angegebenen Wert neu initialisieren (so dass der Zählerschlüssel den Wert 0 hat). Warum geschieht das nicht?

5 Stimmen

@raffamaiden: Standardargumente werden nur einmal ausgewertet, wenn die Funktion definiert wird, und nicht bei jedem Funktionsaufruf.

7voto

def staticvariables(**variables):
    def decorate(function):
        for variable in variables:
            setattr(function, variable, variables[variable])
        return function
    return decorate

@staticvariables(counter=0, bar=1)
def foo():
    print(foo.counter)
    print(foo.bar)

Ähnlich wie der obige Code von Vincent würde dies als Funktionsdekorator verwendet werden und auf statische Variablen muss mit dem Funktionsnamen als Präfix zugegriffen werden. Der Vorteil dieses Codes (obwohl zugegebenermaßen jeder schlau genug sein könnte, um es herauszufinden) ist, dass Sie mehrere statische Variablen haben können und diese auf eine konventionellere Weise initialisieren können.

6voto

VPfB Punkte 12017

Nachdem ich mehrere Ansätze ausprobiert habe, habe ich eine verbesserte Version von @warvariucs Antwort verwendet:

import types

def func(_static=types.SimpleNamespace(counter=0)):
    _static.counter += 1
    print(_static.counter)

5voto

wannik Punkte 11760

Eine statische Variable innerhalb einer Python-Methode

class Count:
    def foo(self):
        try: 
            self.foo.__func__.counter += 1
        except AttributeError: 
            self.foo.__func__.counter = 1

        print self.foo.__func__.counter

m = Count()
m.foo()       # 1
m.foo()       # 2
m.foo()       # 3

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X