Definitionen

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.
oscar15
User
Beiträge: 67
Registriert: Freitag 3. März 2006, 15:43
Wohnort: Kölle

Hallo noch maa!!

Hätte da wieder eine Frage!!

Ich habe jetzt eine Definition, doch ich bekomme meine zugewiesenen Werte nicht aus der Definition "raus"!!

Code: Alles auswählen

def test():
    a = 1
    b = 2

print test()
test()



Aber nun bekomme ich sie weder mit, oder ohne, print raus!!
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Das ist keine Definition, das ist eine Funktion, und Du deklarierst Variablen im Funktions-Namensraum. Der ist von außen nicht zugreifbar (da er eh nur besteht wenn die Funktion gerade läuft, und jedes mal anders ist/sein kann).

Was willst Du machen? Dann kann man Dich eher auf eine mögliche Art und Weise wie das ganze zu funktionieren hat hinweisen. Nur so ein paar Stichwörter in den Raum geworfen: global, return...
--- Heiko.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Eine Funktion ist nicht dazu da, Daten zu speichern. Sie fuehrt nur etwas aus, und wenn die Funktion zu ende ist, werden a und b wieder geloescht, wenn man sie nicht an den aufrufer zurueckgibt.
Schau dir mal das an:

Code: Alles auswählen

def test():
    a=1
    b=2
    print a
    print b

test()

Code: Alles auswählen

def test():
    a=1
    b=2
    return (a, b)

print test()
EDIT: Vielleicht wills du ja auch Klassen definieren???
oscar15
User
Beiträge: 67
Registriert: Freitag 3. März 2006, 15:43
Wohnort: Kölle

ich will eine zuweisung erstellen, damit ich später auf sie zugreifen kann! Die Variabeln werden aber noch von anderen Zuweisungen benutzt.
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Code: Alles auswählen

def test():
    global a, b
    a, b = 10, 20

a, b = 5, 10
print a, b
test()
print a, b
Das ungefähr was Du willst? Das ist aber alles andere als sauber. Siehe Rebeccas zweite Beispiel mit dem return (a,b), was Du dann auch im Hauptprogramm zuweisen kannst, was erheblich besser ist...
--- Heiko.
oscar15
User
Beiträge: 67
Registriert: Freitag 3. März 2006, 15:43
Wohnort: Kölle

Ja, danke!!

Genau das ist es!

Nur was bewirkt der Befehl global?

Trotzdem nochmal danke, danke, danke
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

global bewirkt dass der Name/die Namen die nach ihm genannt werden als Namen im globalen Namespace (also nicht dem Namensraum der Funktion, den ich vorhin schon angesprochen hatte) behandelt werden. Der globale Namensraum überzieht das ganze Skript.

Es sei aber noch mal gesagt: globale Variablen sind im Normalfall BÖSE!
--- Heiko.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Normalerweise sind Variablen nur in einem eingeschraenkten Bereich gueltig. Variablen, die im Hauptprogramm definiert sind, sind in Funktionen nicht sichtbar, und auf Variablen, die in Funktionen definiert sind, kann man vom Hauptprogramm nicht zugreifen.

Auf globale Variablen hingegen kann man von ueberall zugreifen. Dadurch kann man auch ziemlichen Murks machen, und man sollte sie nicht verwenden, wie Modelnine schon sagte. Meistens geht es naemlich auch anders.

EDIT: Ich bin heute zu langsam...
oscar15
User
Beiträge: 67
Registriert: Freitag 3. März 2006, 15:43
Wohnort: Kölle

Danke Heiko!!

aber da hätte ich dann noch eine frage!

Wenn ich jetzt ein Glied aus der Kette löschen möchte, ich aber nicht weiß an welcher Stelle es steht, und nur den Namen habe, welche Befehle gibt es dann?

Ich habe es bereits mit

Code: Alles auswählen

del test[name]
probiert(sowohl mit " wie auch ohne ihnen!!
oscar15
User
Beiträge: 67
Registriert: Freitag 3. März 2006, 15:43
Wohnort: Kölle

Trotzdem danke Rebecca, auch wenn du nen bissl länger gebraucht hast ;) , ich weiß deine Hilfe trotzdem zu schätzen!! :)

Immerhin weiß ich es ja nicht!!
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Wenn ich jetzt ein Glied aus der Kette löschen möchte, ich aber nicht weiß an welcher Stelle es steht, und nur den Namen habe, welche Befehle gibt es dann?
Du willst einen Namen löschen? Probiers mal mit:

Code: Alles auswählen

a = 10
print a
del a
print a
Was einen NameError geben sollte, was eben bedeutet, dass dieser Name nicht (mehr) definiert ist. Wie ich bereits sagte: der Name ist kein Bestandteil der Funktion, sondern ein Name des globalen Namespaces. Du greifst also auch auf ihn nicht über test zu, sondern über a, b, etc. del <Name> löscht den Namen aus dem lokalen Namespace.
--- Heiko.
oscar15
User
Beiträge: 67
Registriert: Freitag 3. März 2006, 15:43
Wohnort: Kölle

Ich wollte einen Namen aus einer Liste in eine andere "transferieren", also aus einer löschen und in einer anderen hinzufügen!!

Derzeit schaffe ich es nur, wenn der Name das erste Glied in der Kette ist (a[0])!!
Aber wenn die Liste geshufflet wird, ist sie nicht mehr das erste Glied!!
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Ach so, du redest von Listen!

Code: Alles auswählen

test = [5, 1, 2, "bla"]
test.remove(2)
print test
test.remove("bla")
print test
EDIT: Oh, Fehler im Code! Es heisst natuerlich remove!
oscar15
User
Beiträge: 67
Registriert: Freitag 3. März 2006, 15:43
Wohnort: Kölle

danke, genau das hab ich gesucht, hab auch schon mit del probiert, klapp aber nicht!! ;)

danke, remove is gut!!

nur was ist der unterschied remove und del?
oscar15
User
Beiträge: 67
Registriert: Freitag 3. März 2006, 15:43
Wohnort: Kölle

Also auf ein neues....

Nun ich habe eine gemischte Liste. Ich füge die ersten 7 Glieder in eine andere Liste. Nun sind es aber Namen, da die erste Liste ja gemischt ist weiß ich nicht ihre namen! Wie soll ich sie also in der zweite Lsite einfügen?

Code: Alles auswählen

del Liste1[:7]
Liste2.append(??)
Wie kann man das lösen?
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Code: Alles auswählen

liste2.extend(liste1[:7])
del liste1[:7]
sollte tun was Du willst.
--- Heiko.
oscar15
User
Beiträge: 67
Registriert: Freitag 3. März 2006, 15:43
Wohnort: Kölle

ja genau diesen Befehl hab ich gesucht!!

danke nochmal, aber bitte nicht weglaufen ich brauche sicher gleich nochmaa Hilfe!! :P
oscar15
User
Beiträge: 67
Registriert: Freitag 3. März 2006, 15:43
Wohnort: Kölle

so....

da bin ich wieder...

neues Problem (was auch sonst!! :D)

Also ich habe vollgendes Problem:

Ich will meine eine Liste mischen...

Problem:
AttributeError: 'builtin_function_or_method' object has no attribute 'shuffle'

Code: Alles auswählen

random.shuffle(liste)
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

random ist nicht das was es vorgibt zu sein (nämlich ein Modul), weil Du es irgendwo in Deinem Programm überschrieben hast.

Guck mal genau nach wo Du den Namen random benutzt (eben außerhalb des Kontextes den Du da geschrieben hast), und ersetz den Namen da durch was sinnvolleres.

Das sollte helfen.
--- Heiko.
oscar15
User
Beiträge: 67
Registriert: Freitag 3. März 2006, 15:43
Wohnort: Kölle

from random import *

ist das einzige mal!!

danach wird noch eine andere Liste gemischt!!
Antworten