Python 值更新到多个字典

Python 值更新到多个字典,python,class,dictionary,Python,Class,Dictionary,我正在用Python 2.7.6构建图灵机的一部分。我使用的方法包括创建一个state类,并为每个state创建一个新的类实例。在这些状态中,我有一个空白字典来存储转换函数 class State: name = "" transitions = {} def __init__(self, name): self.name = name def addTransition(self, symbol, transition): s

我正在用Python 2.7.6构建图灵机的一部分。我使用的方法包括创建一个state类,并为每个state创建一个新的类实例。在这些状态中,我有一个空白字典来存储转换函数

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,它的输出是相同的。如何将转换函数只分配给一个状态而不是所有状态?是什么造成了这种影响?我唯一的想法是,它与在字典中存储状态有关。

而不是:

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中,成员变量是根据需要动态创建的,因此,如果要使用成员变量名称和转换声明状态类,请执行以下操作:

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

不要忘记使用反构造函数来减少计数!谢谢卡尔普拉特!我更新了答案。这就是我为了学习而尝试添加到示例中得到的结果。