我一直在尝试执行replace(L,old_obj,new_obj),但是我可以弄清楚为什么它无法返回正确的代码

时间:2019-03-20 21:32:56

标签: python

def replace(L, old_obj, new_obj):
    L=[]
    for i in enumerate(L):
        if i ==old_obj:
            L.replace(old_obj, new_obj)
    return

我不知道该怎么做才能使此代码起作用。我是否遗漏了一些重要的东西可以更改此代码?我想在L中创建一个列表,然后让一个新对象替换列表中的一个。例如L=[1,2,1,2,3]. replace(L, 2, 'a')L=[1,'a',1,'a',3]

1 个答案:

答案 0 :(得分:1)

我认为您的函数的第一行:

L=[]

是您遇到的第一个问题,它会掩盖此处的其他错误。 Python既不是按值调用也不是按引用调用-它是call-by-object-reference,这是微妙的(但重要的是)不同。即使您将L对象作为函数的第一个参数传递,L=[]也不会更改该对象。它创建一个 new 空列表对象,并将名称L分配给该对象。在那一刻之后,一旦函数返回,您对L所做的任何操作都将永远丢失。即使您的其余职能正常运转,您也永远不会知道,因为您的劳动成果将会丢失。

我建议在此使用以下两种方法之一:

1:将L对象突变就位。

def mutate_list(L, old_obj, new_obj):
    for i, value in enumerate(L):
        if value == old_obj:
            L[i] = new_obj

我认为更好的是:

  1. 构建并返回一个新的列表对象。
def return_new_list(L, old_obj, new_obj):
    new_list = []
    for value in L:
        if value == old_obj:
            new_list.append(new_obj)
        else:
            new_list.append(value)
    return new_list

一旦您真正熟悉Python,您可能会写得更像:

new_list = [value if value != old_obj else new_obj for value in L]

...但是那是另一天。