2016-02-26 63 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?传递函数