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:

Code: Alles auswählen

import a
b = a.b
del a
Nur das der Name `a` nicht wirklich im Namensraum des importierenden Moduls gebunden und gelöscht wird.

@auser: Warum so kompliziert?

parr.py:

Code: Alles auswählen

eine_variable = 1
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... :idea:
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
:D Danke!

@auser : sorry, wenn das hier etwas parallel laeuft...

:wink:
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.