web-dev-qa-db-ja.com

AttributeError:pythonに属性を設定できません

ここに私のコードがあります

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

最後の行では、items[node.ind].v値をnode.vに設定することはできません。エラーが発生しています

"AttributeError: can't set attribute"

何が悪いのかわかりませんが、node.v+=1のようなステートメントを使用しても同じエラーが表示されるため、構文に基づいている必要があります。私はPythonが初めてなので、上記の変更を可能にする方法を提案してください。

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

(注:関数_replaceの先頭にアンダースコアがあるため、このソリューションを使用することをお勧めしません。具体的には、namedtupleの一部の関数には、「プライベート」であることを示すためではない先頭のアンダースコアがあります)

namedtuplesは、標準のタプルのように不変です。次の2つの選択肢があります。

  1. 別のデータ構造を使用します(例:クラス(または単なる辞書);または
  2. 構造を更新する代わりに、置き換えます。

前者は次のようになります。

class N(object):

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

そして後者:

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

編集:後者が必要な場合、Ignacioの答えは、ベイクイン機能を使用して同じことをよりきちんと行います。

54
jonrsharpe