为什么当作为参数传递给函数时,此数组的值会发生变化?

时间:2015-07-26 12:05:29

标签: python arrays function

我遇到问题,当我将数组传递给函数时,数组的原始值会发生变化。我下面的例子应该澄清我的意思。

所以,如果我有下降的例子:

def swap(array):
    while True:
        noChange = True
        for i in range(len(array) - 1):
            if array[i] > array[i + 1]:
                array[i], array[i + 1] = array[i + 1], array[i]
                noChange = False
        if noChange:
            return array

def baseline(array):
    array = sorted(array)
    return array

array = [20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0]
sortedArray = swap(array)
print array # Result: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
array = [20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0]
sortedArray = baseline(array)
print array # Result: [20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

从上面,您可以看到,出于某种原因,array在运行名为swap的函数时被更改,但是当我运行baseline时。在名为swap的函数中,我尝试重新命名arraylocalArray的所有实例,看看它是否有所作为,但我还是有相同的问题

我确定这是非常显而易见的事情,但有人能够解释为什么会这样吗?

2 个答案:

答案 0 :(得分:4)

当您将列表array传递给函数时,参数引用相同的列表对象,如果在函数内部进行了修改,则原始列表也会被修改。

如果这不是您想要的,请复制功能开头的列表:

def swap(array):
    array = array[:]
    # ...

答案 1 :(得分:2)

当您将一个列表传递给一个函数时,您将传递给它的引用,因此如果您更改该函数内的列表它也会被更改,您可以发送一个浅表的列表副本(因为列表只包含整数)作为参数,以便它不会被改变。

调用函数时 -

import copy
sortedArray = swap(copy.copy(array))

另一种方法是复制函数中的数组,例如 -

import copy
def swap(array):
    array = copy.copy(array)

当您的列表包含对其他可变对象的引用时,您应该使用copy.deepcopy()函数(如果您将在对象内部进行更改,但您不希望相同的更改反映到原始列表中的对象)。