簡體   English   中英

重寫函數以返回變異列表

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

即使你實際上並沒有改變它。 這是因為l1l的“淺”副本,這意味着它指向 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.

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