Can';我不明白为什么数据结构会在Python中被修改

Can';我不明白为什么数据结构会在Python中被修改,python,Python,对于家庭作业,我正在进行各种测试,无法找出以下代码的内容: grammar = [ ("exp", ["exp", "+", "exp"]), ("exp", ["exp", "-", "exp"]), ("exp", ["(", "exp", ")"]), ("exp", ["num"]), ] def expand(tokens, grammar): result = [] for pos in range(len(tokens)

对于家庭作业,我正在进行各种测试,无法找出以下代码的内容:

grammar = [ 
    ("exp", ["exp", "+", "exp"]),
    ("exp", ["exp", "-", "exp"]),
    ("exp", ["(", "exp", ")"]),
    ("exp", ["num"]),
    ]


def expand(tokens, grammar):
    result = []
    for pos in range(len(tokens)):
        print "pos = " + str(pos)
        rulec = 0
        for rule in grammar:
            # hmmmm
            print "rule = " + str(rule)
            if tokens[pos] == rule[0]:
                print "token matches rule!"
                if pos == 0:
                    for i in range(1,len(rule)):
                        result.append(rule[i])
                else:
                   for i in range(1,len(rule)):
                        result[rulec].extend(rule[i])                
            else:
                print "token doesn't match rule"
                if pos == 0:
                    print "First instance"
                    result.append([tokens[pos]])
                else:
                    print "Appending..."
                    #result[rulec].extend(copy.copy(tokens[pos]))
                    result[rulec].extend('abc')
            print "result so far = " + str(result)
            print "grammar so far = " + str(grammar)
            rulec += 1
    print "result = " + str(result)
    for i in result:
        yield i

depth = 1
utterances = [["exp","a","exp"]]
for x in range(depth):
    for sentence in utterances:
        utterances = utterances + [ i for i in expand(sentence, grammar)]

for sentence in utterances:
    print sentence
如果我执行上述操作,我希望得到以下结果:

['exp', 'a', 'exp']
['exp', '+', 'exp', 'a', 'b', 'c', 'exp', '+', 'exp']
['exp', '-', 'exp', 'a', 'b', 'c', 'exp', '-', 'exp']
['(', 'exp', ')', 'a', 'b', 'c', '(', 'exp', ')']
['num', 'a', 'b', 'c', 'num']
['exp', 'a', 'exp']
['exp', '+', 'exp', 'a', 'b', 'c', 'exp', '+', 'exp', 'a', 'b', 'c']
['exp', '-', 'exp', 'a', 'b', 'c', 'exp', '-', 'exp', 'a', 'b', 'c']
['(', 'exp', ')', 'a', 'b', 'c', '(', 'exp', ')', 'a', 'b', 'c']
['num', 'a', 'b', 'c', 'num', 'a', 'b', 'c']
然而,我实际上明白了这一点:

['exp', 'a', 'exp']
['exp', '+', 'exp', 'a', 'b', 'c', 'exp', '+', 'exp']
['exp', '-', 'exp', 'a', 'b', 'c', 'exp', '-', 'exp']
['(', 'exp', ')', 'a', 'b', 'c', '(', 'exp', ')']
['num', 'a', 'b', 'c', 'num']
['exp', 'a', 'exp']
['exp', '+', 'exp', 'a', 'b', 'c', 'exp', '+', 'exp', 'a', 'b', 'c']
['exp', '-', 'exp', 'a', 'b', 'c', 'exp', '-', 'exp', 'a', 'b', 'c']
['(', 'exp', ')', 'a', 'b', 'c', '(', 'exp', ')', 'a', 'b', 'c']
['num', 'a', 'b', 'c', 'num', 'a', 'b', 'c']
由于某种原因,我无法理解,当我在[[“exp”,“a”,“exp”]]中的“exp”之间传递一个普通字符串(例如,“a”)时,该字符串会添加到末尾。我放入了一堆print语句,似乎一旦pos==1并且代码附加到结果列表,它也会附加到语法列表。然而,就我的一生而言,我不明白为什么。我看不出有什么联系

如果这有帮助,当我运行代码时,问题似乎在这里:

pos = 1
rule = ('exp', ['exp', '+', 'exp'])
token doesn't match rule
Appending...
result so far = [['exp', '+', 'exp', 'a'], ['exp', '-', 'exp'], ['(', 'exp', ')'], ['num']]
grammar so far = [('exp', ['exp', '+', 'exp', 'a']), ('exp', ['exp', '-', 'exp']), ('exp', ['(', 'exp', ')']), ('exp', ['num'])]
    for i in range(1,len(rule)):
        result.append(rule[i])
else:
    for i in range(1,len(rule)):
        result[rulec].extend(rule[i])
  • 问题#1-结果不应在结尾处有额外的“a” 第一个嵌入列表
  • 问题2——为什么要修改语法
  • 我错过了什么?
    --Jim

    问题在于,你在重复话语,同时附加到话语中。试着这样做:

    sentences = []
    for x in range(depth):
      for sentence in utterances:
        sentences = sentences + [ i for i in expand(sentence, grammar)]
    
    for sentence in sentences:
      print sentence
    
    你的问题是:

    pos = 1
    rule = ('exp', ['exp', '+', 'exp'])
    token doesn't match rule
    Appending...
    result so far = [['exp', '+', 'exp', 'a'], ['exp', '-', 'exp'], ['(', 'exp', ')'], ['num']]
    grammar so far = [('exp', ['exp', '+', 'exp', 'a']), ('exp', ['exp', '-', 'exp']), ('exp', ['(', 'exp', ')']), ('exp', ['num'])]
    
        for i in range(1,len(rule)):
            result.append(rule[i])
    else:
        for i in range(1,len(rule)):
            result[rulec].extend(rule[i])
    
    在这里:

    result[rulec].extend('abc')
    
    您正在将一个列表附加到结果中,然后通过添加“abc”来更改该列表。问题在于,您不仅仅是在扩展
    结果中包含的列表
    ;您也在对
    语法中的列表执行相同的操作。您可以使用切片表示法来附加列表的副本:

        for i in range(1,len(rule)):
            result.append(rule[i][:])
    else:
        for i in range(1,len(rule)):
            result[rulec].extend(rule[i][:])
    

    谢谢你的快速回复。当我尝试这个想法时-我仍然得到相同的结果/有相同的问题。我想我已经回答了这两个问题-你没有看到我提供的答案,或者它没有意义吗?是的,你看到了(回答了两个问题)-这是对css的回答的回应,以确保我清楚地说明了问题。然而,在我提交这个澄清之前,你已经回答了。太好了,就是这样!谢谢艾米-我以为是那样的,但我想不出来。我不知道你可以像那样使用切片-谢谢你的提示。:-)