【问题标题】:Why does the value of this array change when passed into a function as an argument?为什么这个数组的值在作为参数传递给函数时会发生变化?
【发布时间】:2015-10-16 16:12:00
【问题描述】:

我遇到了一个问题,当我将数组传递给函数时,数组的原始值发生了变化。我下面的例子应该能阐明我的意思。

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

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 的函数中,我尝试将array 的所有实例重命名为localArray 以查看是否有所不同,但我仍然遇到同样的问题。

我确信这是我看过的非常明显的事情,但有人能够解释为什么会发生这种情况吗?

【问题讨论】:

  • @MarkusMeskanen 当我第一次打印array 时,它不应该改变我最初定义的值,不是吗?这就是我遇到问题的部分。

标签: python arrays function


【解决方案1】:

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

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

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

【讨论】:

  • 好的,非常感谢!语法 [:] 的名称是什么,以便我可以搜索并了解它的作用?另外,我一定是错的,但是为什么调用baseline的函数没有发生这种情况,而且,当我在函数swap中更改array的名称时,这不应该发生吗?
  • 列表切片是名称。在这里查看 - docs.python.org/2.3/whatsnew/section-slices.html。需要注意的重要一点是对数组进行切片会返回一个浅表副本到列表中。
【解决方案2】:

当您将列表传递给函数时,您正在传递对它的引用,因此如果您更改函数内部的列表,它也会被更改,您可以发送列表的浅表副本(因为列表仅包含integers) 作为参数,所以它不会被改变。

调用函数时做-

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

另一种方法是在函数中复制数组,示例 -

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    相关资源
    最近更新 更多