Python将列表中的项重置为其初始值

时间:2017-02-02 16:39:41

标签: python list python-3.x nested-lists

我有几个列表列表,我希望能够在整个代码中编辑列表中的项目,然后将它们全部重置为初始值。

以下是一个例子:

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]中然后再将其复制回来,而不会让两个副本都引用相同的索引?

或者可能有更简单的方法来实现相同的预期结果,将列表中的所有项目都返回原始值?

2 个答案:

答案 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会让你回到初始状态。