Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [PYTHON] Creare un oggetto con un nuovo riferimento in un loop

    Ciao a tutti ragazzi, sono nuovo al Python e sto avendo un piccolo problema, questa è la parte di codice interessata:

    codice:
    nodelist = []
    for rule in applicableRules:
        temp_wrkmry = {}
        temp_wrkmry = rule.applyRule(nodelist[0])
        nodelist.append(temp_wrkmry)
    Dunque, ho questa lista chiamata nodelist che deve contenere vari elementi di tipo dizionario.
    Io creo un oggetto di questo tipo appena entrato nel ciclo e gli passo il riferimento a un altro dizionario che viene restituito da "applyRules"

    In seguito voglio appenderlo a nodelist, il problema è che ogni volta viene cambiato il riferimento a tutti gli oggetti dentro la lista.

    Per esempio:

    - Durante il primo ciclo applyRule restituisce A, quindi nodelist = [A]

    - Durante il secondo ciclo applyRule restituisce B, nodelist diventa [B, B], mentre invece dovrebbe essere [A, B]

    Sapete a cosa è dovuto questo fatto? Grazie per l'attenzione.

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Vedo alcuni problemi:
    1) la riga "temp_wrkmry = {}" è inutile se la riga successiva sovrascrivi temp_wrkmry
    2) la riga temp_wrkmry = rule.applyRule(nodelist[0]) dovrebbe darti errore "IndexError: list index out of range" in quanto nodelist[0] alla prima iterazione è ancora vuoto
    3) ti sei sicuramente dimenticato un ritorno a capo prima della parola "for"

    Forse hai copia/incollato male il tuo codice interessato?

  3. #3
    Puoi postare il codice di rule.applyRule?
    In ogni caso, alla peggio puoi forzare l'inserimento di una copia nella lista, usando copy (o deepcopy, a seconda del genere di oggetto da copiare) del modulo copy.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Dunque...

    1) Pensavo, con quell'istruzione, di creare un nuovo dizionario, come posso evitare che sovrascriva?

    2) Prima ci sono altre righe di codice che non ho messo perchè inutili e che inseriscono un elemento nella lista

    3) Hai ragione, incollato male il codice, fate conto che sia indentato bene

    Ecco il codice di applyRule:

    codice:
    def applyRule(self, working_memory):
             temp_wrkmry = working_memory
             for conclusion in self.conclusions: 
                  temp_wrkmry = conclusion.applyConclusion(temp_wrkmry)
             return temp_wrkmry
    Già che ci sono metto pure il codice di applyConclusion, non si può mai sapere, anche se qui c'è semplicemente la modifica di temp_wrkmry, che vi ricordo essere un dizionario:

    codice:
    def applyConclusion(self, working_memory):
             temp = working_memory
             if (self.conclusion_name == 'retract'):
                 if (not temp.has_keys(self.fact.getFactName())):
                     raise FactNotFoundException(self.fact.getFactName())
                 del temp[self.fact.getFactName()]
             elif (self.conclusion_name == 'assert'):
                 tempFact = Fact.Fact()
                 tempFact.setFactName(self.fact.getFactName())
                 for att_value in self.fact.attributes:
                     if (isinstance(att_value.getValue(), str)):
                         att_value.setValue(self.rule.variables[att_value.getValue()])
                     tempFact.addValAtt(att_value)
                 del temp[self.fact.getFactName()]
                 temp[self.fact.getFactName()] = tempFact

  5. #5
    Tutti i vari temp_wrkmry, workingmemory & co. si riferiscono sempre allo stesso oggetto in nodelist[0]; se vuoi lavorare su una sua copia, creala con copy.copy (o deepcopy, a seconda che vengano modificati anche gli elementi).
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Ok, ho passato copy.deepcop() e ora funziona, grazie mille, potete chiudere

  7. #7

    (per inciso, su questo forum non c'è l'uso di chiudere le discussioni quando il problema è risolto)
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.