我有几个列表列表,我希望能够在整个代码中编辑列表中的项目,然后将它们全部重置为初始值。
以下是一个例子:
list_a = [0, 1, 2]
list_b = [list_a, 3, 4]
list_c = [6, 7]
list_d = [8, 9]
lists = [0, list_b, 5, list_c, list_d]
#As you can see, lists are of varying length, and sometimes nested multiple times.
print(lists)
Out>>> [0, [[0, 1, 2], 3, 4], 5, [6, 7], [8, 9]]
#Currently, I'm saving the important items of "lists" in the first item, like this:
lists[0] = lists[1:]
#Then I edit the values of various items, like this:
lists[1][0][2] = 0
lists[2] = 0
lists[3][1] = 0
lists[4][1] = 0
print(lists[1:])
Out>>> [[[0, 1, 0], 3, 4], 0, [6, 0], [8, 0]]
#Then I try to reset those values to the originals that I stored in lists[0]
lists[1:] = lists[0]
print(lists[1:])
Out>>> [[[0, 1, 0], 3, 4], 5, [6, 0], [8, 0]]
如您所见,此方法适用于列表[2],因为该项是值,而不是嵌套列表。似乎即使我使用[1:]在lists [0]中制作副本,对嵌套列表的引用也是被复制的,而不是那些嵌套列表中的值。
如何正确地将列表[1:]的值复制到列表[0]中然后再将其复制回来,而不会让两个副本都引用相同的索引?
或者可能有更简单的方法来实现相同的预期结果,将列表中的所有项目都返回原始值?
答案 0 :(得分:1)
使用深层复制:Mike Sand's
这将复制对象以及子对象。
答案 1 :(得分:0)
使用persistent data structures。避免突变可以实现更大的共享,避免在这样的距离内采取怪异的行动。
例如:
>>> from pyrsistent import pvector
>>> list_a = pvector([0, 1, 2])
>>> list_b = pvector([list_a, 3, 4])
>>> list_c = pvector([6, 7])
>>> list_d = pvector([8, 9])
>>> lists = pvector([0, list_b, 5, list_c, list_d])
>>> print(lists)
pvector([0, pvector([pvector([0, 1, 2]), 3, 4]), 5, pvector([6, 7]), pvector([8, 9])])
>>> lists = lists.set(0, lists[1:])
>>> lists = lists.transform([1, 0, 2], 0)
>>> lists = lists.transform([2], 0)
>>> lists = lists.transform([3, 1], 0)
>>> lists = lists.transform([4, 1], 0)
>>> print(lists[1:])
pvector([pvector([pvector([0, 1, 0]), 3, 4]), 0, pvector([6, 0]), pvector([8, 0])])
>>> lists = lists[:1] + lists[0]
>>> print(lists[1:])
pvector([pvector([pvector([0, 1, 2]), 3, 4]), 5, pvector([6, 7]), pvector([8, 9])])
>>>
此外,Python还有非列表变量。随机值列表的第一个元素是“保存”事物的奇怪地方。鉴于上述情况,您可以将原始值保留在另一个变量中。例如:
>>> list_a = pvector([0, 1, 2])
>>> list_b = pvector([list_a, 3, 4])
>>> list_c = pvector([6, 7])
>>> list_d = pvector([8, 9])
>>> lists = original = pvector([list_b, 5, list_c, list_d])
现在你可以使用lists
来解决问题,当你厌倦了它时,lists = original
会让你回到初始状态。