[英]Python: How to reverse a list in a new dictionary without reversing the original
[英]How to reverse a list without modifying the original list in Python
我正在嘗試通過以下方式使用 reverse() 方法:
>>> L=[1,2,3]
>>> R=L
>>> L.reverse()
>>> L
[3, 2, 1]
>>> R
[3, 2, 1]
為什么它也會反轉 R? 如何保留原始列表並創建反向列表?
謝謝!
你需要復制一份你的清單
L=[1,2,3]
# R=L
R = L[:]
L.reverse()
或更直接(使用切片符號反轉):
R = L[::-1]
如果你只是寫R = L
那么R
只是同一個列表L
上的一個新引用。
如果您還需要復制列表中的元素,請使用copy.deepcopy
; R = L[:]
只產生一個淺拷貝(這在你的情況下很好,列表中只有int
s)。
為避免反轉R
,您需要一份L
的副本
要復制,請更改
R=L <---- this is not copying L in to R
到
R= L[:] <---- this will create a copy of L in to R
>>> L=[1,2,3]
>>> R=list(reversed(L))
>>> R
[3, 2, 1]
>>> L
[1, 2, 3]
這會做
R = L[:]
閱讀有關復制和深度復制的內容以了解發生這種情況的原因。 簡而言之,這是因為當您執行R = L
,兩者都指向內存中的“相同”列表,因此反轉一個將反轉另一個。
或者,您可以使用deepcopy
操作
R=L
意味着變量 R 存儲 L 正在存儲的任何內容,即 R 對 L 所引用的任何值的引用。 現在,當您反轉 L 時,這意味着 L 所引用的列表已反轉。由於 R 也引用了相同的地址,因此您將看到 R 已反轉。
您已經被 Python 分配引用而不是副本這一事實所困擾。
Python 僅使用引用來防止不需要的副本。 它在傳遞函數參數時也使用引用,甚至使用默認函數參數。 它僅在您明確告訴它時才會復制,例如通過執行
L = list(R)
或者
from copy import copy
L = copy(R)
兩者的區別在於list(R)
總是返回一個列表,其中copy
返回一個與原始類型相同的對象。 此外, copy
不適用於迭代器,但list
可以。
請注意,這些是“淺”副本。 如果列表包含對象,則新列表包含對相同對象的引用。 對於“深度”副本,它在模塊copy
具有deepcopy
功能。
from copy import deepcopy
L = deepcopy(R)
但在實踐中很少需要制作顯式副本。 Python 提供了例如可用於遍歷列表的reversed
內置函數。
for l in reversed(L):
# do stuff
它返回一個迭代器,所以它是高效的。 無需復制列表。 其他可能需要副本的情況可以由例如生成器函數處理。 復制的有效情況可能是將數據傳遞到線程邊界之外。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.