簡體   English   中英

如何在不修改 Python 中的原始列表的情況下反轉列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM