我正在编写一个函数,将字符串解析为另一个函数使用的列表。它执行的一个操作是在特定的递归深度(由名为lvl
的变量定义的深度)中将字符附加到(有时是深度递归的)列表内的字符串。这个操作是一个名为listSurgery
的函数,它应该被一个索引列表调用,这些索引列表指示下一个列表在前一个列表中的位置,最后的索引告诉深层列表中的哪个索引在以下列表中执行操作正在调用一个空白的索引列表,我不知道为什么。它应该被调用的列表是[-1]
,但是调试显示它被[]
调用。这是代码,缩写为:
def listAssign(lst,index,item):
"""Assigns item item to list lst at index index, returns modified list."""
lst[index] = item
return lst
def listInsert(lst,index,item):
"""Inserts item item to list lst at index index, returns modified list."""
print "listInsert just got called with these arguments:",lst,index,item
if index == 'end':
index = len(lst)
lst.insert(index,item)
return lst
def listSurgery(lst,indices,f,*extraArgs):
"""Performs operation f on list lst at depth at indices indices, returns modified list."""
print "listSurgery just got called with these arguments:",lst,indices,f,extraArgs
parent = lst
for index in indices[:-1]:
parent = parent[index]
parent = f(parent,indices[-1],*extraArgs)
return listSurgery(lst,indices[:-1],listAssign,parent)
def parseStringToList(s):
"""Takes in a user-input string, and converts it into a list to be passed into parseListToExpr."""
# ...
l = [] # List to build from string; built by serially appending stuff as it comes up
b = True # Bool for whether the parser is experiencing spaces (supposed to be True if last character processed was a space)
t = False # Bool for whether the parser is experiencing a string of non-alphanumeric characters (supposed to be True if last character was a non-alphanumeric character)
lvl = 0 # Keeps track of depth at which operations are supposed to be occurring
for c in s:
if c == ' ': # If c is a space, ignore it but send signal to break off any strings currently being written to
b = True
# Some elifs for c being non alphanumeric
else: # If c is alphanumeric, append it to the string it's working on
print c,"got passed as an alphanumeric; lvl is",lvl
assert c.isalnum()
if b or t: # If the string it's working on isn't alphanumeric or doesn't exist, append a new string
l = listSurgery(l,[-1]*lvl + ['end'],listInsert,'')
b, t = False, False
l = listSurgery(l,[-1]*(lvl+1),lambda x,y,z:listAssign(x,y,x[y]+z),c)
print l
return l
while op != 'exit' and op != 'quit': # Keep a REPL unless the user types "exit" or "quit", in which case exit
op = raw_input("> ")
if op == 'help':
pass # Print help stuff
elif op in {'quit','exit'}:
pass
else:
print str(parseStringToList(op))
我用python -tt code.py
调用了代码并键入了1+1=2
,这就是我得到的:
> 1+1=2
1 got passed as an alphanumeric; lvl is 0
listSurgery just got called with these arguments: [] ['end'] <function listInsert at 0x10e9d16e0> ('',)
listInsert just got called with these arguments: [] end
listSurgery just got called with these arguments: [''] [] <function listAssign at 0x10e9d10c8> ([''],)
Traceback (most recent call last):
File "analysis.py", line 276, in <module>
print str(parseStringToList(op))
File "analysis.py", line 218, in parseStringToList
l = listSurgery(l,[-1]*lvl + ['end'],listInsert,'')
File "analysis.py", line 63, in listSurgery
return listSurgery(lst,indices[:-1],listAssign,parent)
File "analysis.py", line 62, in listSurgery
parent = f(parent,indices[-1],*extraArgs)
IndexError: list index out of range
任何人都能解释一下吗?为什么listSurgery
获得[]
而不是[-1]
? lvl
是0
,并且应该在该点传递的参数是[-1]*(lvl+1)
。甚至不介意为什么用['']
而不是'1'
来调用它。
答案 0 :(得分:3)
您的lvl
为0,因此[-1]*lvl + ['end']
为['end']
,indices[:-1]
为['end'][:-1]
。现在['end']是一个长度为1的列表,因此['end'][:-1]
与['end'][:1-1]
相同,这与['end'][:0]
相同。这将评估为空列表。