Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 名单突然改变了,即使我不改变它_Python_Python 3.x_List_Deep Copy - Fatal编程技术网

Python 名单突然改变了,即使我不改变它

Python 名单突然改变了,即使我不改变它,python,python-3.x,list,deep-copy,Python,Python 3.x,List,Deep Copy,我有相当复杂的代码。有三个列表。short-list1和comparsion列表应该进行比较,如果发现某些特定的匹配项,我们将list1中的值添加到list2中。整个代码如下 list1 = [['item1', ['item2'], '0', '0'], ['item3', ['item4'], '107', '2'], ['item4.5', ['item5', 'item4.5 aaa'], '120', '2'], ['item6', ['item6 item6 aaa'], '127'

我有相当复杂的代码。有三个列表。short-list1和comparsion列表应该进行比较,如果发现某些特定的匹配项,我们将list1中的值添加到list2中。整个代码如下

list1 = [['item1', ['item2'], '0', '0'], ['item3', ['item4'], '107', '2'], ['item4.5', ['item5', 'item4.5 aaa'], '120', '2'], ['item6', ['item6 item6 aaa'], '127', '1'], ['item7', ['item7 item7 aaa'], '129', '1']]
comparsion_list = [['item1', ['item2'], 'unknown'], ['item3', ['item4'], 'unknown'], ['item4.5', ['item5', 'item4.5 aaa'], 'unknown'], ['item6', ['item6 item6 aaa'], 'unknown']]
list2 = [['category', ['keywords'], ['long-names'], 'amount', 'amount2'],['empty', ['empty'], ['empty'], 'empty', 'empty']]

for a in range(len(comparsion_list)): #we go trough comparsion_list -start number is 1, end is category len
    for i in range(len(list1)): #and compare them with each item of list1

        if list1[i][1][0] in comparsion_list[a][1] and comparsion_list[a][2] not in [x[0] for x in list2]:
            list2.append([comparsion_list[a][2]]) #append item to list2 as list (to create row)
            list2[-1].append([list1[i][0]])
            list2[-1].append(list1[i][1])
            print("list1 before elif is: "+str(list1[0]))  #just for testing - everything still ok

        elif list1[i][1][0] in comparsion_list[a][1] and comparsion_list[a][2] == list2[-1][0]:
            print("list1 after elif is: "+str(list1[0])) #just for testing - not ok!
            list2[-1][2].extend(list1[i][1])
但产出如下:

list1 before elif is: ['item1', ['item2'], '0', '0']
list1 after elif is: ['item1', ['item2'], '0', '0']
list1 after elif is: ['item1', ['item2', 'item4'], '0', '0']
list1 after elif is: ['item1', ['item2', 'item4', 'item5', 'item4.5 aaa'], '0', '0']
如您所见,list1已更改,但我并没有在代码中全部更改它!甚至没有引用,因为它始终是deepcopy,而清单1的deepu保持不变。我认为预期输出应该如下所示:

list1 before elif is: ['item1', ['item2'], '0', '0']
list1 after elif is: ['item1', ['item2'], '0', '0']
list1 after elif is: ['item1', ['item2'], '0', '0']
list1 after elif is: ['item1', ['item2'], '0', '0']
但当我删除这一行时(从elif语句中):

然后输出正常(第二个)。
怎么可能呢?我缺少什么?

您正在将对
list1
元素的引用附加到
list2
。其中一个元素是可变(
列表
)本身。如果通过显式复制列表强制创建新的内存对象,那么问题就迎刃而解了

list2[-1].append(list1[i][1].copy()) #in the 'if' part of the code.

除此之外,我可能会重构整个怪物。

请做一个标记,并从问题不需要的代码中删除你的问题。你的代码片段太乱了,以至于我放弃了理解它-这是行噪声,真的。还有像
deep\u of_list1=deepcopy(list1);list1=deepcopy(deep\u of\u list1)
真的没有帮助。为什么您认为您的deepcopy应该保护您免受此影响?很明显,你是在对可变对象进行各种附加,然后对它们进行变异……好吧,我的问题是,如果列表1没有任何更改(没有附加/扩展,它没有引用),那么列表1怎么可能发生更改?当我删除最后一行附加到列表2的位置时,这没关系……@AndreasBekkelund“它没有引用”是什么意思?您可以清楚地
。将
列表1
中的项目引用附加到
列表2
中,然后您可以对
列表2
中的项目进行变异,这些项目可能与
列表1
中的项目相同。。。您不断重复“没有引用”,但这显然是错误的,因此您可能误解了deepcopy的功能,或者存在一些沟通错误
list2[-1].append(list1[i][1].copy()) #in the 'if' part of the code.