web-dev-qa-db-fra.com

AttributeError: impossible de définir l'attribut dans python

Voici mon code

N = namedtuple("N", ['ind', 'set', 'v'])
def solve()
    items=[]
    stack=[]
    R = set(range(0,8))
    for i in range(0,8):
        items.append(N(i,R,8))      
        stack.append(N(0,R-set(range(0,1)),i))
    while(len(stack)>0): 
        node = stack.pop()
        print node
        print items[node.ind]   
        items[node.ind].v = node.v

Dans la dernière ligne, je ne peux pas définir le items[node.ind].v valeur à node.v comme je veux, et je reçois l'erreur

"AttributeError: can't set attribute"

Je ne sais pas ce qui ne va pas, mais ce doit être quelque chose basé sur la syntaxe en utilisant des déclarations comme node.v+=1 montre également la même erreur. Je ne connais pas encore Python, alors suggérez un moyen de rendre possible le changement ci-dessus.

54
Pratyush Dhanuka
items[node.ind] = items[node.ind]._replace(v=node.v)

(Remarque: Ne vous découragez pas pour utiliser cette solution en raison du trait de soulignement dans la fonction _replace. Spécifiquement pour les noms nommés, certaines fonctions ont un trait de soulignement qui n'est pas destiné à indiquer qu'elles sont censées être "privées".)

51

namedtuples sont immuables, tout comme les n-uplets standard. Vous avez deux choix:

  1. Utilisez une structure de données différente, par exemple une classe (ou juste un dictionnaire); ou
  2. Au lieu de mettre à jour la structure, remplacez-la.

Le premier ressemblerait à ceci:

class N(object):

    def __init__(self, ind, set, v):
        self.ind = ind
        self.set = set
        self.v = v

Et ce dernier:

item = items[node.ind]
items[node.ind] = N(item.ind, item.set, node.v)

Edit: si vous voulez ce dernier, la réponse d'Ignacio fait la même chose de manière plus nette en utilisant la fonctionnalité intégrée.

54
jonrsharpe