值更新到多个词典

时间:2014-04-18 18:12:43

标签: python class dictionary

我在Python 2.7.6中构建图灵机的一部分。我使用的方法涉及创建状态类并为每个状态创建类的新实例。在状态内,我有一个空白字典,用于存储转换函数。

class State:
    name = ""
    transitions = {}

    def __init__(self, name):
        self.name = name

    def addTransition(self, symbol, transition):
        self.transitions[symbol] = transition

状态的每个实例都保存在字典中,以便在初始化期间可以轻松引用它。这允许我通过打开名称为键

的字典条目来引用对象
self.States[temp] = State(temp)
//temp is read from the tape, currently this is called twice with temp = q0 and q1

当我尝试将转换函数添加到内部词典时,我的问题就出现了。当我将记录添加到一个状态时,它将它添加到每个状态内的字典中,在每个状态内创建一个相同的副本。显然,这成了问题。

def readTransitionTuple(self):
    StateI = ''
    StateF = ''
    SymbolI = ''
    SymbolF = ''
    Action = ''

    // Code reads input from tape here //

    print (StateI, StateF, SymbolI, SymbolF, Action)

    self.States[StateI].addTransition(SymbolI,(StateF, SymbolF, Action))

readTransitionTuple被调用两次,并输出变量的这些值:

('q0', 'q2', '0', '1', 'R')

('q1', 'q0', '1', '0', 'L')

当我尝试打印状态q0的转换时,它给出了我的输出:

{'1': ('q0', '0', 'L'), '0': ('q2', '1', 'R')}

如果我尝试打印q1,则输出相同。如何将转换功能仅分配给一个状态而不是全部状态?是什么导致了这种影响?我唯一的想法是它与将状态存储在字典中有关。

2 个答案:

答案 0 :(得分:1)

这是因为您将名称和转换定义为静态(类)变量。在python中,成员变量是根据需要动态创建的,因此如果要使用成员变量name和transitions声明State类,请按以下方式执行:

class State:
    instance_count = 0  # as an example, this is now a static variable counting instances.

    def __init__(self, name):
        self.name = name      # name is now a member variable
        self.transitions = {} # transitions is now a member variable
        State.instance_count += 1

    def addTransition(self, symbol, transition):
        self.transitions[symbol] = transition

    def __del__(self):
        State.instance_count -= 1

答案 1 :(得分:0)

而不是:

class State:
    name = ""
    transitions = {}

    def __init__(self, name):
        self.name = name

    def addTransition(self, symbol, transition):
        self.transitions[symbol] = transition

你需要:

class State:
    def __init__(self, name):
        self.name = name
        self.transitions = {}

    def addTransition(self, symbol, transition):
        self.transitions[symbol] = transition

阅读Python's Classes教程以获取更多信息。特别是this section