1

我正在扫描一个文档,列出读入的每一行。

我将其保存到一个名为

testList = []

当我完成填充此列表时,我想将其设置为字典中的值,其键基于另一个列表的元素。这个想法是它应该看起来像这样:

testList = ['InformationA', 'InformationB', 'Lastinfo']
patent_offices = ['European Office', 'Japan Office']
dict_offices[patent_offices[0]] = testList

或者

dict_offices = {'European Office' : ['InformationA', 'InformationB', 'Lastinfo'],
'Japan Office' : ['Other list infoA', 'more infoB']}

我想稍后输入dict_offices['European Office']并打印列表。

但是因为我在阅读文档时会动态收集它,所以我会擦除并重用它 testList。我所看到的是在它被清除后它也在字典的链接中被清除。

如何创建字典以便保存它以便我可以在每个循环中重用 testList?

这是我的代码:

patent_offices = []
dict_offices = {}
office_index = 0
testList = []

# --- other conditional code not shown

if (not patent_match and start_recording):
                if ( not re.search(r'[=]+', bString)): #Ignore ====== string

                        printString = fontsString.encode('ascii', 'ignore')   
                        testList.append(printString)                         


    elif (not start_recording and patent_match):

                dict_offices[patent_offices[office_index]] = testList
                start_recording = True
                office_index += 1
                testList[:] = []      

这本字典已正确更新,并且看起来与我想要的完全一样,直到我调用

testList[:] = []

线。这本字典就像testList. 我知道字典与此相关,但我不知道如何不发生这种情况。

4

2 回答 2

3

列表是可变的;对同一列表的多次引用将看到您对其所做的所有更改。意思是:用一个空列表testList[:] = []替换这个列表中的每个索引。因为您在不同的地方(包括在字典值中)引用了同一个列表,所以您会看到随处反映的变化。

相反,只需指向testList一个的空列表:

testList = []

您使用的空切片分配语法应该只在您想清除列表的内容时使用,而不是在您只想创建一个新的空列表时使用。

>>> foo = []
>>> bar = foo
>>> foo.append(1)
>>> bar
[1]
>>> foo is bar
True
>>> foo[:] = []
>>> bar
[]
>>> foo = ['new', 'list']
>>> bar
[]
>>> foo is bar
False
于 2013-02-12T21:21:45.227 回答
0

你将不得不做一个深拷贝,见 copy.html

dict_offices[patent_offices[office_index]] = copy.deepcopy(testList)

例子:

l = [1,2,3]
b = l
del l[:]
print(b)
 ---> []

l = [1,2,3]
b = copy.deepcopy(l)
l = []
print (b)
  ---> [1,2,3]
于 2013-02-12T21:29:19.880 回答