lokale Variablen

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
kip
User
Beiträge: 3
Registriert: Dienstag 15. Februar 2005, 18:50

Dienstag 15. Februar 2005, 20:29

Hallo zusammen,

bin Neuling was python betrifft und wundere mich gerade darüber wie python lokale Variablen behandelt (naja, ist wahrscheinlich eher ein Denkfehler von mir ;)):

Ich habe eine Methode die ich nutze um über die Elemente eines XML-Dokuments zu iterieren, d.h. die ich öfters aufrufe.

Bei jedem Aufruf erzeuge ich eine Instanz eines Objekts, weise dem Objekt Werte zu und returne es dann.

Code: Alles auswählen

class a:
   def method:
      [...]
      foo = blah()
      [...]
      return foo
Mein Verständnis von OO-Programmierung sagt mir, dass die lokale Variable "foo" nach Ausführung von "method" verworfen wird und beim nochmaligen Aufruf von "method" ein neues Objekt von blah() erzeugt wird -> dies ist aber nicht der Fall :(.

Beim 2. und jedem weiteren Aufruf von method existiert das Objekt foo=blah() schon (es hat alle Werte des Objekts, die beim vorigen Aufruf von method zugewiesen wurden)

Kann mir das vllt. jemand erklären?

danke im voraus,
dennis

Edit (Leonidas): Code in Python Tags gesetzt.
Beyond
User
Beiträge: 227
Registriert: Freitag 6. September 2002, 19:06
Kontaktdaten:

Dienstag 15. Februar 2005, 21:14

Das sollte definitiv nicht so sein. Wenn es eine gleichnamige globale Variable gibt, gibt's imho einen Fehler. Wenn Du Variablen in Funktionsparameter initialisierst, dann bleiben sie allerdings die selben ...
Ein bischen mehr Code / das konkrete Beispiel, wäre hilfreich.

cu beyond
kip
User
Beiträge: 3
Registriert: Dienstag 15. Februar 2005, 18:50

Dienstag 15. Februar 2005, 21:28

Hallo,

dann poste ich mal den kompletten Code, hier erstmal die Methode die ich öfters aufrufe:

Code: Alles auswählen

	def getNextItem(self):
		node = self.getNextNode()

		if node == None:
			return None
		
		item = dbitem()
		
		for n in self.atags:
			element = node.getElementsByTagName(n)
			if element.length > 0:
				child = node.getElementsByTagName(n)[0].firstChild
				if child != None and child.nodeType == xml.dom.Node.TEXT_NODE:
					item.setVal(n, child.data)
		
		return item
Das "Problemkind" ist die Variable item bzw. das Objekt dbitem() ...
Hier die dbitem-Klasse:

Code: Alles auswählen

class dbitem:
	data = {}
	
	def setVal(self, key, val):
		self.data[key] = val
		return
	
	def getVal(self, key):
		return self.data[key]
		
	def values(self, order):
		list = []
		for i in order:
			list.append(self.data[i])
		return list
	
	def valuesNoOrder(self):
		return self.data.values()
any ideas?

Edit (Leonidas): Code in Python Tags gesetzt.
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Dienstag 15. Februar 2005, 21:36

Hi kip,

Code: Alles auswählen

class dbitem:
    data = {} # hier ist das Problem
   
    def setVal(self, key, val):
        self.data[key] = val
        return

    ....
data ist als Klassenvariable definiert und gilt so natürlich für alle Instanzen der Klasse und hat auch in allen Instanzen den gleichen Wert.

Code: Alles auswählen

class dbitem:
    
    def __init__(self):
        self.data = {} # data ist jetzt Instanzvariable
   
    def setVal(self, key, val):
        self.data[key] = val
        return
    
    ....
sollte das Problem beheben.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
kip
User
Beiträge: 3
Registriert: Dienstag 15. Februar 2005, 18:50

Dienstag 15. Februar 2005, 21:40

hallo,

vielen Dank, das hat in der Tat geholfen :)

gruss,
dennis
Antworten