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

lokale Variablen

Beitragvon kip » 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.
Benutzeravatar
Beyond
User
Beiträge: 227
Registriert: Freitag 6. September 2002, 19:06
Kontaktdaten:

Beitragvon Beyond » 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

Beitragvon kip » 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.
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » 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: Alles auswählen

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

Beitragvon kip » Dienstag 15. Februar 2005, 21:40

hallo,

vielen Dank, das hat in der Tat geholfen :)

gruss,
dennis

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder