[英]rewrite a fuction to return a mutated list
嘿(:我必須重寫代碼以返回一個變異列表
function的原碼
def times(l, n) :
l_original = l
for i in range(2, n+1) :
l_original = l + l_original
return l_original
我試圖讓它發生變異:
def times_mut(l,n):
l1= l
for _ in range(2,n-1):
l.extend(l1)
l = [1,2,3]
times_mut(l,6)
print(l)
所以我的想法是一遍又一遍地更改原始列表,或者我如何將列表更改為變異列表?
預期的 output 應該是 l*n。
首先,在 Python 中,變異或返回是一種很好的做法,但不是兩者都發生。 也就是說,您刪除return
是正確的。
其次,這里的問題是您如何使用extend
,它會與l1
一起改變列表, l1 是原始列表的副本。
如果您運行代碼並在循環中打印l1
以進行調試:
def times_mut(l,n):
l1= l
for _ in range(2,n-1):
print(l1) # debugging
l.extend(l1)
l = [1,2,3]
times_mut(l,6)
print(l)
你會看到l1
像這樣變化:
[1, 2, 3]
[1, 2, 3, 1, 2, 3]
[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]
[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]
即使你實際上並沒有改變它。 這是因為l1
是l
的“淺”副本,這意味着它指向 memory 中的相同位置。因此,您對l
所做的任何更改也會出現在l1
中。
為什么這不會在原始代碼中發生? 因為l_original = l + l_original
創建了一個新列表並存儲在局部變量l_original
中,而內置函數如 extend、append 等會改變 object。
此外,一個簡單的解決方案是使用copy.deepcopy
,它基本上復制l
的內容並將其存儲在新的 memory 空間中,如下所示:
import copy
def times_mut(l,n):
l_original=copy.deepcopy(l)
for iii in range(2,n+1):
l.extend(l_original)
l = [1,2,3]
times_mut(l,6)
print(l)
output:
[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.