全局列表中的第一个值是否正在以某种方式在函数中更新?

时间:2018-10-18 03:57:58

标签: python function variable-assignment

由于某种原因,列表x中的第一个值正在更新,但列表中其他所有内容都没有更新。我很困惑,因为x是全局变量,并且仅在replace函数中更新。如果我在打印语句之间重新声明x,则该程序有效。我已将其注释掉,因为它感觉像是草率的解决方案。

x = [1,3,2,4,2,1,1,2,2,1] 

def REPLACE(new,old,x):
    if str(old) not in str(x):
        return x
    elif x[0] == old:
        x[0] = new
        return x[0:1] + REPLACE(new,old,x[1:])
    else:
        return x[0:1] + REPLACE(new,old,x[1:])


print(REPLACE(10,1,x))
#x = [1,3,2,4,2,1,1,2,2,1]
print(REPLACE(1,3,REPLACE(1,3,x)))

2 个答案:

答案 0 :(得分:0)

在您的REPLACE函数中,唯一改变x的语句是:

x[0] = new

仅修改x的第一项,而

return x[0:1] + REPLACE(new,old,x[1:])

创建x的切片,这是新的列表实例,因此对切片的进一步更改将不会反映在原始x中。

如果您打算使此函数同时更改x并在保持递归的状态下返回结果,则可以使用索引作为参数:

def REPLACE(new, old, x, i=0):
    if i >= len(x):
        return x
    if x[i] == old:
        x[i] = new
    return REPLACE(new, old, x, i + 1)

答案 1 :(得分:0)

您可以在REPLACE函数中更改其值。由于您要形成新列表,因此不必这样做。只需阅读x,而不更改它即可。

x = [1,3,2,4,2,1,1,2,2,1] 

def REPLACE(new,old,x):
    if str(old) not in str(x):
        return x
    elif x[0] == old:
        return [new] + REPLACE(new,old,x[1:])
    else:
        return x[0:1] + REPLACE(new,old,x[1:])


print(REPLACE(10,1,x))
print(REPLACE(1,3,REPLACE(1,3,x)))