Objekt hat kein Attribut <hier Namen der Funktion einfügen>

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Tobs
User
Beiträge: 65
Registriert: Sonntag 29. September 2013, 11:11

Ich habe ja bereits vorher die Frage gestellt, ob es eine Regel in Python ist, dass
eine globale Variable im Programm einen Wert hat, der in der Methode neu definiert werden kann,
aber beim verlassen der Methode wieder auf den Wert außerhalb der Methode zurückgesetzt wird?
Tobs
User
Beiträge: 65
Registriert: Sonntag 29. September 2013, 11:11

Also:

def funktion():

global Variable
Variable = "Wert in Funktion"

Variable = "Wert normal"
funktion()
print(Variable)

----

Ausgabe:
"Wert normal"

???
BlackJack

@Tobs: Ähm Du setzt diese globale Variable doch ganz offensichtlich *selbst* immer wieder auf diesen langen Ausgangswert. Nämlich jedes mal wenn die Methode rekursiv aufgerufen wird.
Tobs
User
Beiträge: 65
Registriert: Sonntag 29. September 2013, 11:11

Das war nur die Darstellung dafür, dass die Variable einen anderen Wert in der Funktion hat,
wenn sie in der Funktion geändert wird. Danach hat sie wieder den Wert den sie außerhalb der Funktion hatte
BlackJack

@Tobs: Das Verhalten was Du beschreibst kann so nicht sein. Wenn da nach dem Ablauf der Methode wieder der Wert vor dem Ablauf der Methode an den globalen Namen gebunden ist, dann muss das irgendwo explizit in Deinem Code, den Du nicht zeigst, passieren. Von alleine passiert das *selbstverständlich nicht*.
Tobs
User
Beiträge: 65
Registriert: Sonntag 29. September 2013, 11:11

Die Variable taucht nur an 4 Stellen auf:

Im Hauptprogramm: -ganz oben Loesung = [Liste mit vielen Elementen]
-ganz unten(print(Loesung))

In der Funktion: -oben: global Loesung
-mitte: Loesung = Zuege <---Zuege ist auch ne Liste
BlackJack

@Tobs: Ähm mir fällt gerade auf Du *veränderst* die Liste. Das ist Dir klar, oder? Vielleicht möchtest Du an der Stelle ja eine *Kopie* der `Zuege`-Liste an `Loesung` binden. Und/oder das beim rekursiven Aufruf machen.
Tobs
User
Beiträge: 65
Registriert: Sonntag 29. September 2013, 11:11

Die Liste mit den Elementen ist praktisch nur ein Platzhalter, der die Bedingung in der späteren Funktion erfüllen soll,
dass, egal wie lang die erste Lösung ist, die Liste immer ein Element länger ist, damit sie übernommen wird.
Er speichert die bisher schnellste Lösung in dieser Variable
BlackJack

@Tobs: Du *veränderst* die *Zuege*-Liste, nachdem Du sie an `Loesung` gebunden hast. Wenn Du die Liste danach veränderst, nun dann veränderst Du die Liste. Und deswegen hast Du am Ende etwas anderes in der Liste stehen als zu dem Zeitpunkt an dem Du sie an das globale `Loesung` gebunden hast. Was im Grunde passiert ist das hier:

Code: Alles auswählen

In [12]: zuege = [1, 2, 3]

In [13]: loesung = zuege

In [14]: zuege.append(42)

In [15]: zuege
Out[15]: [1, 2, 3, 42]

In [16]: loesung
Out[16]: [1, 2, 3, 42]
Du willst eine *Kopie* von `zuege` an `loesung` binden und nicht die *selbe* Liste.
Antworten