webentwicklung-frage-antwort-db.com.de

So machen Sie eine lokale Variable (innerhalb einer Funktion) global

Mögliches Duplikat:
Verwenden globaler Variablen in einer anderen Funktion als der, die sie erstellt hat

Ich verwende Funktionen, damit mein Programm nicht durcheinander kommt, aber ich weiß nicht, wie ich eine lokale Variable in eine globale Variable umwandeln kann.

29
user1396297

Hier sind zwei Methoden, um dasselbe zu erreichen:

Verwenden von Parametern und Rückgabe (empfohlen)

def other_function(parameter):
    return parameter + 5

def main_function():
    x = 10
    print x    
    x = other_function(x)
    print x

Wenn Sie main_function Ausführen, erhalten Sie die folgende Ausgabe

>>> 10
>>> 15

Verwenden von Globals (tun Sie dies niemals)

x = 0   # The initial value of x, with global scope

def other_function():
    global x
    x = x + 5

def main_function():
    print x    # Just printing - no need to declare global yet
    global x   # So we can change the global x
    x = 10
    print x
    other_function()
    print x

Jetzt erhalten Sie:

>>> 0    # Initial global value
>>> 10   # Now we've set it to 10 in `main_function()`
>>> 15   # Now we've added 5 in `other_function()`
27
Alex L

Deklarieren Sie einfach Ihre Variable außerhalb einer Funktion:

globalValue = 1

def f(x):
    print(globalValue + x)

Wenn Sie aus der Funktion heraus zuweisen für das globale Objekt benötigen, verwenden Sie die Anweisung global:

def f(x):
    global globalValue
    print(globalValue + x)
    globalValue += 1
13
Greg Hewgill

Wenn Sie Zugriff auf die internen Zustände einer Funktion benötigen, sollten Sie möglicherweise eine Klasse verwenden. Sie können dafür sorgen, dass sich eine Klasseninstanz wie eine Funktion verhält, indem Sie sie aufrufbar machen. Dazu definieren Sie __call__:

class StatefulFunction( object ):
    def __init__( self ):
        self.public_value = 'foo'

    def __call__( self ):
        return self.public_value


>> f = StatefulFunction()
>> f()
`foo`
>> f.public_value = 'bar'
>> f()
`bar`
9
Matthew Trevor

Durch die Verwendung von Globals wird Ihr Programm auch zu einem Chaos. Ich schlage vor, Sie versuchen sehr, sie zu vermeiden. "Global" ist jedoch ein Schlüsselwort in Python, sodass Sie eine bestimmte Variable wie folgt als global festlegen können:

def foo():
    global bar
    bar = 32

Ich sollte erwähnen, dass es äußerst selten vorkommt, dass das Schlüsselwort "global" verwendet wird. Daher schlage ich ernsthaft vor, Ihr Design zu überdenken.

6
Arafangion

Sie können den Modulbereich verwenden. Angenommen, Sie haben ein Modul namens utils:

f_value = 'foo'

def f():
    return f_value

f_value ist ein Modulattribut, das von jedem anderen Modul geändert werden kann, das es importiert. Da es sich bei den Modulen um Singletons handelt, können alle anderen Module, für die das Modul importiert wurde, auf Änderungen an utils zugreifen:

>> import utils
>> utils.f()
'foo'
>> utils.f_value = 'bar'
>> utils.f()
'bar'

Beachten Sie, dass Sie die Funktion nach Namen importieren können:

>> import utils
>> from utils import f
>> utils.f_value = 'bar'
>> f()
'bar'

Aber nicht das Attribut:

>> from utils import f, f_value
>> f_value = 'bar'
>> f()
'foo'

Dies liegt daran, dass Sie das Objekt, auf das das Modulattribut verweist, als f_value im lokalen Bereich, aber binden Sie es dann erneut an die Zeichenfolge bar, während die Funktion f noch auf das Modulattribut verweist.

4
Matthew Trevor