为什么我要逐个元素复制数组,然后追加到列表而不是直接追加?

Why should I copy the array element by element and then append to list instead of appending directly?

提问人:Mukesh Mahadev 提问时间:7/21/2022 最后编辑:BarmarMukesh Mahadev 更新时间:7/22/2022 访问量:64

问:

在下面的代码中,我使用回溯打印所有子集。 我终于打印了res_list

res_list = [[], [13], [12], [12, 13]]

当我将 的元素逐个复制到列表中并附加到(第 4 行)时subset_listres_list

res_list = [[], [], [], []] 

当我直接附加到。(第 3 行)subset_listres_list

我不明白为什么我需要逐个元素复制,然后附加而不是直接附加。subset_listres_listsubset_list

def print_subsets(arr, len_arr, cur_index, sub_set_list, res_list):
    if cur_index == len_arr:
        # res_list.append(sub_set_list)
        res_list.append([x for x in sub_set_list])
        return   


     # Include the element into the array list and pass to the next function call
        print_subsets(arr, len_arr, cur_index + 1, sub_set_list, res_list)
        sub_set_list.append(arr[cur_index])
        print_subsets(arr, len_arr, cur_index + 1, sub_set_list, res_list)
        sub_set_list.remove(arr[cur_index])

if __name__ == "__main__":
    res = []
    sub_list = []
    A = [12, 13]
    print_subsets(A, len(A), 0, sub_list, res)
    print(res)
python 参数传递 传递-引用 回溯

评论

2赞 Barmar 7/21/2022
就地修改。如果使用 ,则会将引用追加到同一列表,以便对其进行更新。当您使用列表推导式时,您正在制作一个副本,因此它不会更新。sub_set_listres_list.append(sub_set_list)
0赞 Guy 7/21/2022
直接追加它,更改 中的值并检查 中的值会发生什么变化。res_listsub_set_list
0赞 Barmar 7/21/2022
您可以将其简化为res_list.append(sub_set_list.copy())
0赞 Mortz 7/21/2022
在您提供的示例中,您的函数根本不会执行print_subsets
0赞 slothrop 7/21/2022
res_list.append(sub_set_list[:])是另一种简明的可能性

答:

0赞 Mukesh Mahadev 7/22/2022 #1

subset_list.copy()两者都有效。subset_list[:]

直接附加 的引用。subset_list

为避免这种情况,请创建一个新列表并附加到 .res_list