我在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,则输出相同。如何将转换功能仅分配给一个状态而不是全部状态?是什么导致了这种影响?我唯一的想法是它与将状态存储在字典中有关。
答案 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。