Seite 1 von 1
variable wird nicht geändert...
Verfasst: Donnerstag 11. September 2008, 15:18
von auser
Hallo Welt,
ich habe ein Problem mit einer Variable, die sich nicht ändern lässt:
main.py
Code: Alles auswählen
from parr import *
def test():
print "EINE_VARIABLE = %s" % EINE_VARIABLE
setze_eine_variable_auf(20)
print "EINE_VARIABLE = %s" % EINE_VARIABLE
test()
print "EINE_VARIABLE = %s" % EINE_VARIABLE
parr.py
Code: Alles auswählen
EINE_VARIABLE=1
def setze_eine_variable_auf(wert):
global EINE_VARIABLE
EINE_VARIABLE=wert
EINE_VARIABLE ist immer 1 obwohl ich sie eigentlich auf 20 gesetzt habe.. oder?
Habe mal gehört das für jede Funktion eine Kopie der Variablen erstellt wird oder so. Kann ich irgendwie dafür sorgen das nach "setze_eine_variable_auf(20)" EINE_VARIABLE dannach 20 ist?
danke im voraus
Verfasst: Donnerstag 11. September 2008, 15:29
von DasIch
Lass den Sternchen Import mal weg.
Verfasst: Donnerstag 11. September 2008, 15:32
von cofi
Das was du da schreibst sieht ja grauenhaft aus ..
Python braucht keine Getter und Setter, d.h. du könntest schlichtweg schreiben `EINE_VARIABLE = 20 ', um sie auf 20 zu setzen.
Um dein Problem zu lösen könntest du den Wunschwert zurückgeben, statt es einer Variable im Code zuzuweisen, d.h.
Code: Alles auswählen
def setter(value):
return value
EINE_VARIABLE = setter(20)
Ich sehe allerdings keinen wirklichen Zweck für so einen Code ... falls das nur für dich zum spielen ist in Ordnung. Falls das in ein echtes Projekt einfliessen soll: Denk nochmal drüber nach was du da eigtl machst. Und stell den Code ein, damit dir geholfen werden kann
Aber ich empfehle dir einmal PEP8 anzuschauen. Im Wiki gibts dazu sogar eine deutsche Übersetzung, einfach mal die Suche anwerfen.
Verfasst: Donnerstag 11. September 2008, 17:12
von yipyip
Abseits einiger stilistischer 'Unschoenheiten'
halte ich das eigentliche Problem fuer schon noch etwas
erklaerungsbeduerftig.
Beispiel:
mod1.py:
Code: Alles auswählen
var=1
xyz=100
def set_it(w):
global var, xyz
var = w
xyz = w
mod0.py:
Code: Alles auswählen
import mod1
from mod1 import xyz
def test():
mod1.set_it(20)
test()
print mod1.var, mod1.xyz, xyz
ergibt:
20 20 100
Warum ist mod1.xyz ungleich xyz ?
Verfasst: Donnerstag 11. September 2008, 17:22
von auser
währe folgendes denn stilistisch ok?:
parr.py
Code: Alles auswählen
class parrClass(object):
def __init__(self):
self.EINE_VARIABLE=1
def setzeVariable(self,wert):
self.EINE_VARIABLE=wert
# Hier folgen unverzichtbare Anweisungen, die sich aus der Zuweisung ergeben
parallel = parrClass()
main.py
Code: Alles auswählen
from parr import *
print parallel.EINE_VARIABLE
parallel.setzeVariable(100)
print parallel.EINE_VARIABLE
Verfasst: Donnerstag 11. September 2008, 17:48
von BlackJack
@yipyip: In `mod1` gibt es einen Namen `xyz` der an ein Objekt (100) gebunden wird. Mit dem ``import`` in `mod0` bindest Du *dort* einen Namen `xyz` an das Objekt an das `mod1.xyz` gebunden ist. Der Aufruf von ``mod1.set_it(20)`` bindest den Namen `xyz` im `mod1` neu, das hat aber natürlich keinen einfluss auf die Bindung von `mod0.xyz`.
So ein ``from a import b`` ist von der Semantik her äquivalent zu folgendem:
Nur das der Name `a` nicht wirklich im Namensraum des importierenden Moduls gebunden und gelöscht wird.
@auser: Warum so kompliziert?
parr.py:
main.py:
Code: Alles auswählen
import parr
print parr.eine_variable
parr.eine_variable = 100
print parr.eine_variable
Verfasst: Donnerstag 11. September 2008, 17:54
von auser
Warum so kompliziert?
weil nach der Änderung der einen Variable in meinem Fall noch ein paar andere, abhängig von dieser, geändert werden müssen.
Verfasst: Donnerstag 11. September 2008, 18:09
von Trundle
Dafür gibt es in Python `
property()`.
Verfasst: Donnerstag 11. September 2008, 18:22
von yipyip
@BlackJack
Ahaa...
Mit 'from mod1 import xyz' erzeuge ich also
keine allgemeine Referenz auf auf das xyz in mod1,
sondern einen neuen Namen xyz in mod0, der den
aktuellen(!) Wert von xyz aus mod1 erhaelt.
Damit erklaert sich auch die Ausgabe
20 20 20
wenn man in mod0.py den 'import' etwas umstellt:
Code: Alles auswählen
import mod1
#from mod1 import xyz
def test():
mod1.set_it(20)
test()
from mod1 import xyz
print mod1.var, mod1.xyz, xyz
Danke!
@auser : sorry, wenn das hier etwas parallel laeuft...
yipyip
Verfasst: Donnerstag 11. September 2008, 18:26
von Leonidas
Trundle hat geschrieben:Dafür gibt es in Python `
property()`.
Wenn es etwas komplexer wird, kann man auch
Cellulose nutzen.