我今天有一個痛苦的經歷,我不小心將一個串列傳遞給了一個函式,并且花了我很長時間來除錯。該函式旨在獲取串列并創建類似串列的副本。我沒有意識到這修改了我的原始串列。
L = [0,0,0,0,0]
def similar_list(a_list):
a_list [0] = a_list[0] 1
return a_list
L_similar = similar_list(L)
print(L)
print(L_similar)
#result shows
#[1, 0, 0, 0, 0]
#[1, 0, 0, 0, 0]
我認為最好的方法是在similar_list函式的第一行,添加a_list = a_list.copy()。有更好的方法嗎?我問的是我對 python 的有限研究,我不記得在示例代碼中經常看到這一點。如果您能告訴我這是否是標準做法,將不勝感激。(不過,這似乎是一件很容易出錯的事情,而且當它出錯時很難注意到......)
uj5u.com熱心網友回復:
這一切都取決于similar_list()應該做什么。
如果您打算修改原始串列,只需將其更改為您所看到的:
def similar_list(a_list):
a_list[0] = 1
如您所見,我不回傳原始串列。根據Python 的約定,修改輸入物件的函式或方法,不要回傳它,以避免混淆并更清晰。
如果您打算回傳一個新串列,它具有與不變性相關的許多優點,您可以復制然后修改:
def similar_list(a_list):
newlist = a_list.copy()
newlist[0] = 1
return newlist
如果您需要復制,這是一種標準做法,但最終由您決定。
對于一些優缺點,您可以查閱 Python 的函式式編程官方指南。
uj5u.com熱心網友回復:
而不是使用L_similar = similar_list(L),您可以使用L_similar = similar_list(L[:])來避免原始串列中的任何更改。
試試這個:
L = [0,0,0,0,0]
def similar_list(a_list):
a_list [0] = a_list[0] 1
return a_list
L_similar = similar_list(L[:])
print(L)
print(L_similar)
#result shows
#[0, 0, 0, 0, 0]
#[1, 0, 0, 0, 0]
[編輯]:
但是,這兩種方法L[:]都L.copy()將回傳串列的淺表副本。這意味著如果您修改任何嵌套串列元素,更改都會反映在兩個串列中。考慮下面的例子:
L = [1, [2, 3], 4]
L_copy = L.copy()
L[1][0] = 5
print(L)
print(L_copy)
#result shows
#[1, [5, 3], 4]
#[1, [5, 3], 4]
為避免此問題,您應該使用copy.deepcopy()fromcopy模塊。
import copy
L = [1, [2, 3], 4]
L_copy = copy.deepcopy(L)
L[1][0] = 5
print(L)
print(L_copy)
#result shows
#[1, [5, 3], 4]
#[1, [2, 3], 4]
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/463769.html
標籤:Python python-3.x 算法
