Seite 1 von 1
Lokale - globale Variablen; Übergabe von Parameter
Verfasst: Donnerstag 23. Oktober 2014, 12:22
von lena_92
Hallo zusammen,
ich habe folgednes Porblem. Dazu erst einmal der Code.
Code: Alles auswählen
def Werte():
i = 0
while(i<2):
i = 0
if(i<1):
Var_1 = i
i = i + 1
i = i + 1
Werte()
x_1 = Var_1
Werte()
x_2 = Var_1
Ich definiere eine Fuktion. Diese hat vereinfacht dargestellt eine while-Schleife und eine If-Bedingung. In der If-Bedinung entsteht die Variable "i" die ich dann der "Var_1" zuordne.
Wenn diese Funktion dann aufgerufen wird, soll diese Variable "Var_1" der Variable "x_1" zugeordnet werden. Diese Variable "x_1" wird später dann wieder gebraucht.
Durch die While-Schleife verändert sich "Var_1" dann im zweiten Schritt wieder.
Nun das Problem:
Da Var_1 eine lokale Variable ist, kann ich von außen nicht auf diese Zugreifen. Ich habe schon Nachforschungen angestellt.
Hier meine Idee:
1. Parameterübergabe
2. return - Funktion
3. in extra Datei schreiben
4. Dictonary verwenden
Idee 1 und 2 halte ich für sinnvoll, bekomme da aber kein vernümpftiges Ergebniss. 3 und 4 sind nur Notlösungen.
Gibt es eine einfache Möglichkeit lokale Variablen nach außen zu übergeben?
Grüße
Lena
Foldende Fehlermeldung taucht auf.
x1 = Var_1
NameError: name 'Var_1' is not defined
Re: Lokale - globale Variablen; Übergabe von Parameter
Verfasst: Donnerstag 23. Oktober 2014, 12:48
von Üpsilon
Nun, jede Funktion läuft in einem eigenen
Namensraum, d.h. sie benutzen andere Variablen als das Hauptprogramm.
Funktionen kommunizieren mit dem Hauptprogramm, indem durch
Parameter Werte hinein gegeben werden und durch den
Rückgabewert ein Ergebnis rauskommt.
(Man kann zwar
aus einer Funktion auf eine
Variable des Hauptprogramms lesend zugreifen, aber verursacht Chaos und ist nur beim Zugriff auf Konstanten zu empfehlen.)
Dein Programm müsste also ungefähr so aussehn:
Code: Alles auswählen
def werte():
# ... dein Berechnungscode ...
return var
wert = werte()
Das von dir gezeigte Beispiel kann übrigens nicht funktionieren, da ist die Einrückung kaputt. (Oder spinnt mein Browser?)
Übrigens könntest du mal einen Blick auf die
offiziellen Python-Stiltipps werfen. Da stehen solche Sachen drin wie: Variablennamen schreibt man meistens klein.
Hoffe, ich konnte dir helfen. Als ich mit dem Programmieren angefangen hab, hab ich auch ne Weile gebraucht, um das mit den Funktionen+Namensräumen zu kapieren.
Lg Y.
Re: Lokale - globale Variablen; Übergabe von Parameter
Verfasst: Donnerstag 23. Oktober 2014, 12:49
von garreth
Mir ist zwar schleierhaft was in deiner Funktion passieren soll, aber die gewünschte Ausgabe der Funktion erreichst du über einen "return" Befehl.
Code: Alles auswählen
def berechne_werte():
i = 0
while i < 2: # Schleife gibt keinen Sinn da
i = 0 # bei jedem Durchlauf i immer wieder null zugewiesen wird
if i < 1:
var = i
i = i + 1 # und hier ausschließlich i = 1 rauskommen kann
i = i + 1 # und hier mit i = 2 die Schleife nach dem ersten Durchlauf beendet wird
return var
x = berechne_werte() # So hättest du dann der Variable den Wert von alt Var_1 zugewiesen.
Die Ausgabe deiner Funktion ist allerdings immer 0 und ja an der Einrückung passt definitiv etwas nicht.
Re: Lokale - globale Variablen; Übergabe von Parameter
Verfasst: Donnerstag 23. Oktober 2014, 12:57
von BlackJack
@lena_92: Ergänzend zu den bisherigen Anmerkungen zum Quelltext: ``if`` und ``while`` sind keine Funktionen, also sollte man des Quelltext auch nicht so schreiben als wären es welche. Nach dem Schlüsselwort sollte ein Leerzeichen stehen und die Klammern um die Bedingung sind überflüssig und sollten weggelassen werden.
Neben der Schreibweise gibt es auch Konventionen was für Namen man für Funktionen und andere Objekte vergibt. Funktionen tun etwas und werden deshalb üblicherweise mit der Tätigkeit benannt die sie ausführen. Also nicht `Werte` sondern beispielsweise `berechne_werte()`.
Man sollte auch keine Namen durchnummerieren. Das ist in der Regel ein Zeichen dafür das man die Werte eigentlich in einer Datenstruktur zusammenfassen möchte.
Re: Lokale - globale Variablen; Übergabe von Parameter
Verfasst: Donnerstag 23. Oktober 2014, 13:21
von lena_92
Vielen Dank erst einmal an alle Antworten.
@ Üpsilon, danke für deinen Link. Den schaue ich mir definitiv mal an. Da habe ich bei mir schon Definzite erkannt
Der Code ergibt in der Tat keinen Sinn. Der wurde im Sinne der Übersichtlichkeit zusammen gekürzt. Dadurch wurde die Einrückung in Mitleidenschaft gezogen.
Ich schaue mir den "return"-Befehl mal an.
Danke
Lena
Re: Lokale - globale Variablen; Übergabe von Parameter
Verfasst: Donnerstag 23. Oktober 2014, 13:35
von /me
lena_92 hat geschrieben:Ich schaue mir den "return"-Befehl mal an.
Tu das. Das ist elementar. Werte sollten Funktionen nur über Parameter betreten und über Rückgabe mit
return verlassen.
Re: Lokale - globale Variablen; Übergabe von Parameter
Verfasst: Donnerstag 23. Oktober 2014, 14:53
von lena_92
Hey,
also der "return"-Befehl ist ja super. Habe einige Beispiele durch und habe es nun in meinen Code eingefügt.
Nun bekomme ich aber folgenden Fehler:
"UnboundLocalError: local variable 'erster_knotenpunkt' referenced before assignment"
Dies passiert nur wenn ich den Befehl das zweite Mal aufrufe. D.h. bei einem einmaligen Aufrufen des Befehles funktioniert dieser.
Ich würde dem zweiten Befehl auch gerne eine andere Variable zuordnen.
y = berechne_werte()
y[0]
y[1]
Wisst ihr voran es liegt? Muss ich weitere wichtigen Dinge bei "return" beachten?
Grüße
Re: Lokale - globale Variablen; Übergabe von Parameter
Verfasst: Donnerstag 23. Oktober 2014, 15:00
von /me
lena_92 hat geschrieben:"UnboundLocalError: local variable 'erster_knotenpunkt' referenced before assignment"
Wie sieht der zugehörige Code aus?
Hier mal ein simples Beispiel, wie so ein Fehler zustande kommen kann.
Code: Alles auswählen
def do_things(x):
if not x:
value = 1
value += 1
return value
x = do_things(0)
y = do_things(1)
Beim zweiten Aufruf versuche ich
value zu ändern obwohl
value noch nicht definiert wurde.
value ist lokal, die Funktion merkt sich die Existenz dieser Variablen nicht vom ersten Aufruf.
Re: Lokale - globale Variablen; Übergabe von Parameter
Verfasst: Donnerstag 23. Oktober 2014, 15:41
von lena_92
@ /me - danke für den Hinweis. Daran liegt es tatsächlich. Jetzt ist die Frage, wie du das bei deinem Beispiel elegant lösen würdest?!
Die Variable erst einmal auf "0" definieren ist ja auch nicht stilistisch gut, oder?
Re: Lokale - globale Variablen; Übergabe von Parameter
Verfasst: Donnerstag 23. Oktober 2014, 16:17
von /me
Wenn es so simpel ist:
Wenn es mehr Code ist:
Code: Alles auswählen
if x:
# code code code
value = 1
else:
# other code
value = 0
Re: Lokale - globale Variablen; Übergabe von Parameter
Verfasst: Donnerstag 23. Oktober 2014, 16:22
von lena_92
@ /me
Danke!!!
Das hat wirklich geholfen. Mit Hilfe von dir und einigen Stunden Arbeit ist der SCH*** Fehler endlich weg.
Ich bin sehr glücklich.
Danke
you saved the day!