一种无理由地更改列表值的函数

时间:2012-11-03 03:17:06

标签: python python-2.7

我为这个为python编写的函数感到震惊。我观察到,在较低的while中,它会更改列表vctor中的值,即使该功能未触及该列表。我已通过对(10, [1,3,5,7,10])并将列表vctor更改为[1,3,5,8,10]。对此有解释吗?

def siguiente(k,vctor):
    l = len(vctor)
    vctorsig = vctor
    i = l-1
    while i>= 0:    
        if vctorsig[i] <= k - l + i: 
            j=i
            while j<=l-1:
                print vctor
                vctorsig[j] = vctor[i]+j-i+1
                j=j+1
            i = -1
        else:
            i = i-1
    return vctorsig    

2 个答案:

答案 0 :(得分:6)

当您执行vctorsig = vctor时,您正在vctorsigvctor引用的列表进行引用,因此当您修改它时,您将修改原始列表。

如果您希望将列表复制到那里,您只需执行vctorsig = list(vctor)

答案 1 :(得分:3)

这有点难以辨别,因为你的缩进很有趣,但我认为这句话:

vctorsig = vctor

是你的问题。在此行中,您将为同一列表创建新的引用。换句话说,如果您更改vctorsig(在此行vctorsig[j] = vctor[i]+j-i+1中),您也会更改vctor,因为它们相同的列表。解决这个问题的简单方法是制作副本:

vctorsig = vctor[:]