variable wird nicht geändert...

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.
Antworten
auser
User
Beiträge: 16
Registriert: Samstag 31. Mai 2008, 17:57

Donnerstag 11. September 2008, 15:18

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
DasIch
User
Beiträge: 2465
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Donnerstag 11. September 2008, 15:29

Lass den Sternchen Import mal weg.
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Donnerstag 11. September 2008, 15:32

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.
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Donnerstag 11. September 2008, 17:12

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 ?
auser
User
Beiträge: 16
Registriert: Samstag 31. Mai 2008, 17:57

Donnerstag 11. September 2008, 17:22

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
BlackJack

Donnerstag 11. September 2008, 17:48

@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
auser
User
Beiträge: 16
Registriert: Samstag 31. Mai 2008, 17:57

Donnerstag 11. September 2008, 17:54

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.
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Donnerstag 11. September 2008, 18:09

Dafür gibt es in Python `property()`.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Donnerstag 11. September 2008, 18:22

@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
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 11. September 2008, 18:26

Trundle hat geschrieben:Dafür gibt es in Python `property()`.
Wenn es etwas komplexer wird, kann man auch Cellulose nutzen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten