Python 3.4:函数意外地重新定义了它的输入

时间:2015-07-10 18:46:14

标签: python

我最近开始玩Python 3(或编码,就此而言),我很快遇到了一些我不理解的东西。 我设法定义了一个函数,它不仅会输出错误的输出,还会意外地改变它的输入。我将在一个例子中更精确地解释这一点。

假设我们想要编写一个带有列表/向量的函数

L = [v_0, ..., v_n]

并吐出以下转换版本:

L' = [v_0, v_0+v_1, ..., v_0+...+v_n]

即使有更好的方法,让我们尝试使用这个算法:

  • 步骤0:将L_0 = L设置为初始数据。
  • 步骤1:取L_0 = L并将v_0加到L_0 [j],j> 1。调用结果L_1。
  • ...
  • 步骤i:取L_i并将v_i添加到L_i [j]以获得j> i。调用结果L_i。
  • ...

这使得L'分为n步(希望......)。正如我所说,可能有更好的方法,但让我们坚持这种方法。这是我试图做的事情:

# problematic function:
def Mod(L):
    newL = L
    for i in range(len(L)-1):
        for j in range(i+1,len(V)):
            newL[j] = newL[j] + L[i]
    return newL

# illustration of problem:
L = [1,2,3,4]
print(L)        # gives [1,2,3,4], as expected
print(Mod(L))   # gives [1,3,7,15], L' would be [1,3,4,10]
print(L)        # gives [1,3,7,15] instead of [1,2,3,4]. WHY?!

同样,我不是在寻找更好的解决方案或更好的算法。这是一个人为问题,我已经用另一种方式解决了我的实际问题。我想要的是理解为什么这段代码不能正常工作以及它为什么会这样做。

如上所述,有两件事情出错:
(1)首先,'Mod'没有做我想要的:Mod(L)不给L'。
(2)更重要的是,由于某种原因,运行Mod(L)会改变变量L.

我对此感到非常难过,特别是(2)。我一直在试图找出错误的循环,但我似乎自己被困在一个循环中(一次又一次地忽略同样的事情)。不知何故,Mod的输入必须在循环中的某处重新定义。但我不知道这会发生什么。我看到唯一改变的是局部变量'newL'。

关于我所缺少的任何指示都是非常有用的!

0 个答案:

没有答案