Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么这个数组的值在作为参数传递到函数中时会发生变化?_Python_Arrays_Function - Fatal编程技术网

Python 为什么这个数组的值在作为参数传递到函数中时会发生变化?

Python 为什么这个数组的值在作为参数传递到函数中时会发生变化?,python,arrays,function,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] = arra

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

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

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
,以查看它是否有所不同,但我仍然有相同的问题


我确信这是一件非常明显的事情,我已经仔细看过了,但是有人能解释为什么会发生这种情况吗?

当你把list
数组
传递给一个函数时,参数引用同一个list对象,如果它在函数内部被修改,原始列表也会被修改

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

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

将list
数组
传递给函数时,参数引用将指向同一个list对象,如果在函数内部对其进行了修改,则原始列表也将被修改

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

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

当您将列表传递给函数时,就是在传递对它的引用,因此,如果您在函数中更改列表,它也会被更改,您可以发送列表的浅层副本(因为列表只包含整数)作为参数,这样它就不会被更改

调用函数do时-

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

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

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


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

将列表传递给函数时,即传递对该函数的引用,因此,如果您在函数中更改列表,它也会被更改,您可以发送列表的浅层副本(因为列表只包含整数)作为参数,这样它就不会被更改

调用函数do时-

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

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

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


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

@MarkusMeskanen当我第一次打印
数组时,它不应该改变我最初定义的值,是吗?这就是我遇到的问题。@MarkusMeskanen当我第一次打印
数组时,它不应该改变我最初定义的值,是吗?这是我遇到麻烦的部分。好的,非常感谢!语法的名称是什么,这样我就可以搜索并了解它的功能了?另外,我一定是错了,但是为什么称为
基线
的函数没有发生这种情况,而且,当我在函数
交换
中更改
数组
的名称时,不应该发生这种情况?列表切片就是名称。在这里查看-。需要注意的重要一点是,切片数组会返回列表中的浅层副本。好的,非常感谢!语法的名称是什么,这样我就可以搜索并了解它的功能了?另外,我一定是错了,但是为什么称为
基线
的函数没有发生这种情况,而且,当我在函数
交换
中更改
数组
的名称时,不应该发生这种情况?列表切片就是名称。在这里查看-。需要注意的重要一点是,对数组进行切片会将浅层副本返回到列表中。