所有列表都被Python覆盖

时间:2016-11-10 16:13:17

标签: python list dictionary

我正在尝试创建一个列表,其中保存了此函数中的所有单词以及行号。我认为代码已经完成,但每次其中的列表与另一个列表相同时,所有列表都会被覆盖。

这是代码:

#Python 3.5X

import re

file = open(".\cross.txt", 'r')

def search(s):
    find1 = ''
    find2 = ''
    find3 = ''

    dic = {}
    pattern = re.compile(r"([a-zA-z_]*)[\s.=(]*([a-zA-Z_]*)[\s.=(]*([a-zA-Z_]*)")

    for line, i in enumerate(s.readlines()):
        result = pattern.search(i)
        find1 = ''
        find2 = ''
        find3 = ''
        find1 = result.group(1)
        find2 = result.group(2)
        find3 = result.group(3)
        y=[line]

        if find1 in dic.keys():
            tmp=dic.get(find1)
            tmp.append(line)
            dic[find1] = tmp
        else:
            dic[find1] = y

        if find2 in dic.keys():
            tmp=dic.get(find2)
            tmp.append(line)
            dic[find2] = tmp
        else:
            dic[find2] = y

        if find3 in dic.keys():
            tmp=dic.get(find3)
            tmp.append(line)
            dic[find3] = tmp
        else:
            dic[find3] = y

    return dic

print(search(file))

file.close()

输入:

def readin (file):
 in_file = open(file,"r")
 text = in_file.read()
 in_file.close()
 return text

输出

{'': [3, 4], 'text': [2, 4], 'file': [0, 1], 'close': [3, 4], 'read': [2, 4], 'in_file': [1, 2, 3], 'def': [0, 1], 'readin': [0, 1], 'return': [4], 'open': [1, 2, 3]}

例如,open仅在第1行中,但它会被覆盖。

修改

我试着找到输入中的所有单词。所以对于第一行,我正在寻找“def”“readin”“file”。现在算法将这个关键字写入一个字典,其中包含出现的行(在本例中为0)。

现在检查下一行 - > “in_file”“打开”“文件”。字典现在应该包含def:[0],readin:[0],in_file:[1],file:[0,1],open:[1]。问题是,它还将[1 []添加到def,因为如果我正在查找文件,我会返回[0]并将所有具有值[0]的关键字更改为[0,1]

最小例子:

l[x] = [0]
l[y] = [0]
new_list = [1]
l[x].append(new_list)

现在l [y]和l [x]是[0,1],但只有l [x]应该是。

1 个答案:

答案 0 :(得分:1)

考虑第一次循环执行的情况。即对于文件的第一行:

  • 假设您的正则表达式为您提供了三个值a,b和c,并将它们存储在find1='a', find2='b' and find3='c'.
  • 既然字典最初是空的,那么所有三个其他部分都会执行:
  

dic['a'] = y, dic['b'] = y, dic['c'] = y

  • 现在,如果你还记得python的内存模型,它可以用于引用系统。由于y是参考列表 [1] 的参考,因此所有元素 dic ['a'],dic ['b']和dic ['c'] y 指的是同一个列表:
  

dic['a'] = dic['b'] = dic['c'] = y = [1]

现在考虑循环第二次执行的情况。即对于文件的第二行:

  • 假设您的正则表达式为您提供了三个值a,d和e,并将它们存储在find1='a', find2='d' and find3='e'中。
  • 现在由于'a'已经存在于字典中,因此第一个条件if find1 in dic.keys():的if部分将起作用,它会将2附加到现有列表中:
  

dic['a'] = [1,2]

  • 现在因为 dic ['b'] dic ['c'] 也指同一个列表, dic ['b]的内容'] dic ['c'] 将与 dic ['a'] 相同。
  

dic['a'] = dic['b'] = dic['c'] = [1,2]

  • 现在由于 d e 在dict中不存在,因此键d和e 将重复相同的故事:
  

dic['d'] = dic['e'] = y = [2]

解决方案:

而不是撰写y = [line]并将y分配给dic[find1], dic[find2] and dic[find3],而不是直接指定列表:

dic[find1] = [line]
dic[find2] = [line]
dic[find3] = [line]

这样您将创建三个单独的列表。