Hi,
ich bräuche sowas wie eine globale Variable oder nen Pointer um es zu ermöglichen das beide Module auf das ein und das selbe Objekt queue zugreifen können.
Problembeschreibung:
Wir erstellen eine GUI mit wxPython, die ein anderes Programm mit sockets steuert. Ich will jetzt das die GUI nicht blockiert wird und verwende deshalb 2 Threads (haupt = gui, unterthread für die Sockets). Damit man mehrere Befehle schicken kann will ich eine queue erstellen die diese Speichert und nacheinander abarbeitet. So wie bekomme ich jetzt das Queue Objekt in den Thread?
vielen Dank
wdsl
2Threads, 2 Module: Wie kann ich eine Queue nehmen?
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Man übergibt den Namen an ein Objekt und das Objekt gibt es nur einmal. Sowas heißt in anderen Sprachen Call by Reference. Kopien hast du nur, wenn du ein Objekt mittels `copy.copy()` und ähnlicher Mechanismen kopierst.wdsl hat geschrieben:geht leider nicht da man ja eine Kopie und keine Referenz übergibt
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Hää ich bekomme doch nur die Werte übergeben und nicht die Addresse des Objekt.
Vielleicht mal ne kleine Veranschaulichung was ich machen will
main.py:
modul1.py:
Ich erhalte
Also statt Call by Value wie es immer ist Call by Reference
vielen Dank
wdsl
Vielleicht mal ne kleine Veranschaulichung was ich machen will
main.py:
Code: Alles auswählen
import modul1
b = "3"
print b
test_obj = modul1.modul1(b)
print b
Code: Alles auswählen
class modul1():
def __init__(self, b):
print b
b = 4
print b
ich will aber3
3
4
3
erhalten da ich b irgendwie überschreiben will.3
3
4
4
Also statt Call by Value wie es immer ist Call by Reference
vielen Dank
wdsl
In Python wird IMMER Call-By-Reference verwendet. Dein genanntes Beispiel würde auch unter C so nicht funktionieren:
Du musst natürlich auch angeben, dass du das Objekt ändern willst und nicht den Wert auf den der Name referenziert:
In Python ist es im Prinzip das gleiche, du mußt nur ein Objekt übergeben, dass auch veränderbar (mutable) ist. Das wäre zum Beispiel die Queue.Queue:
Hinzu kommt bei deinem Beispiel noch, das Zahlen immutable, also unveränderlich sind und die diese deshalb auch nicht so einfach Ändern kannst.
Im Standard-Python-Tutorial wird aber eigentlich alles ganz gut beschrieben, vielleicht Hilft dir noch mal ein Blick auf dieses Dokument.[/code]
Code: Alles auswählen
void bar(int *foo) {
foo = 2
}
Code: Alles auswählen
void bar(int *foo) {
*foo = 2
}
Code: Alles auswählen
def spam(q):
q.put("some stuff")
q = Queue.Queue()
spam(q)
Im Standard-Python-Tutorial wird aber eigentlich alles ganz gut beschrieben, vielleicht Hilft dir noch mal ein Blick auf dieses Dokument.[/code]
Es werden Objekte übergeben. Namen werden an Objekte gebunden. Namen sind keine Bezeichnungen für Speicherplätze/Schachteln in die man etwas hinein tut, wie in einigen anderen Sprachen, sondern Notizzettel die an Objekte geklebt werden.wdsl hat geschrieben:Hää ich bekomme doch nur die Werte übergeben und nicht die Addresse des Objekt.
Dein Beispiel etwas kürzer:
Code: Alles auswählen
a = 42
print a
def test(b):
print b
b = 23
print b
test(a)
print a
Dann wird die Funktion `test()` mit diesem Objekt aufgerufen und ein Zettel mit dem lokalen Namen `b` wird auf das Objekt geklebt. Auf dem Objekt kleben jetzt zwei Zettel. Dann wird der Zettel mit dem `b` vom Objekt entfernt und auf ein anderes geklebt: `int(23)`. Das hat keinerlei Auswirkungen auf das `int(42)` Objekt, da klebt weiterhin das `a` drauf. Darum wird das auch von dem ``print`` nach dem Funktionsaufruf ausgegeben.
Von "Call by Value" oder "Call by Reference" zu sprechen ist bei Python etwas irreführend. Es werden keine Werte (=Kopien) übergeben, aber Referenzen auch nicht, weil "Call by Reference" als Beschreibung eigentlich nur Sinn macht, wenn es einen Datentyp "Referenz" oder "Pointer" gäbe.