繁体   English   中英

当作为参数传递给函数时,为什么此数组的值会更改?

[英]Why does the value of this array change when passed into a function as an argument?

我有一个问题,当我将数组传递给函数时,数组的原始值会更改。 下面的示例应阐明我的意思。

因此,如果我有下降的例子:

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]

从上面可以看到,由于某种原因,当运行称为swap的函数但运行baseline时, array已更改。 在名为swap的函数中,我尝试将array所有实例重命名为localArray以查看它是否localArray ,但是我仍然遇到相同的问题。

我确定这是我已经看过的非常明显的东西,但是有人可以解释为什么会这样吗?

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

如果这不是您想要的,请在函数开头复制列表:

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

当您将列表传递给函数时,就是传递对其的引用,因此,如果在函数内部更改列表也将被更改,则可以发送列表的浅表副本(因为列表仅包含整数)如下参数,以便它不会被更改。

调用函数时-

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

另一种方法是在函数内部复制数组,例如-

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM