2016-02-26 88 views
2

修改Python的list我有以下Python代碼:通過它傳遞給函數

def make_great(l): 
    l = ['The great ' + magician for magician in l] 

magicians = ['Tom'] 
make_great(magicians) 
print(magicians) 

打印語句打印原始列表,而不是一個由make_great()功能修改。我試圖找出修改Python列表中的每個元素沒有明確訪問它的索引,然後重新分配該索引的新值的方式。不會的magicians列表現在都指向基於Python的內存模型的理解形成的新的列表?我猜測,我沒有得到期望的結果,因爲這是一個範圍的問題嗎?但是,當我通過在magicians,它在功能參數,因此Python解釋器實際看到magicians = ['The ...取代l

+0

的問題是,你正在修改的局部變量'l'引用新的對象引用或值。相反,你應該修改'l'引用的對象。 – rrrzx

+0

我很困惑,當我使用索引表示法,'l [i]'修改列表時,爲什麼這不被視爲局部變量,但是當我使用'='運算符將'magicians'重新分配給一個新的名單,它現在被認爲是本地? –

+0

@MutatingAlgorithm考慮將'l'變量名重命名爲'lst'或其他更好的可讀名稱,因爲它可以防止與數字'1'混淆。 –

回答

4

當你把它分配給l,你正在重新定義l,不修改它。使用l[:]代替:

def make_great(l): 
    l[:] = ['The great ' + magician for magician in l] 

您也可以返回列表,並重新定義magicians

def make_great(l): 
    return ['The great ' + magician for magician in l] 

magicians = ['Tom'] 
magicians = make_great(magicians) 
print(magicians) 

在這種情況下,你可以分配magiciansmake_great(['Tom'])

magicians = make_great(['Tom']) 
print(magicians) 
0

你的功能不返回任何東西您可以讓您的打印語句在函數或返回修改後的列表,然後打印出來

0
def make_great(l): 
    return ['The great ' + magician for magician in l] 

magicians = ['Tom'] 
magicians = make_great(magicians) 
print(magicians) 

的make_great功能複製你的陣列,所以你需要返回並分配結果的魔術師。

您可以檢查How do I pass a variable by reference?傳遞函數