Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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_Python 2.7_Python 3.x - Fatal编程技术网

Python 为什么我的互换功能互换到位?

Python 为什么我的互换功能互换到位?,python,python-2.7,python-3.x,Python,Python 2.7,Python 3.x,为什么我的交换功能在适当的位置交换? 我的意思是,在交换函数中,“array”是局部变量,我交换局部变量的元素并返回“array”,那么为什么在我传递的列表中进行更改。 例如,如果在调用swap(a,0)后有一个列表a=[1,2,3,4],它应该返回[2,1,3,4],但它也修改了我传递的列表“a”?Python与许多面向对象语言一样,通过共享而不是复制来传递函数参数 您应该将array视为特定内存位的标签。如果函数def(a)使用名为a的变量,则无论何时调用swap(some_variable

为什么我的交换功能在适当的位置交换? 我的意思是,在交换函数中,“array”是局部变量,我交换局部变量的元素并返回“array”,那么为什么在我传递的列表中进行更改。
例如,如果在调用
swap(a,0)
后有一个列表
a=[1,2,3,4]
,它应该返回
[2,1,3,4]
,但它也修改了我传递的列表“a”?

Python与许多面向对象语言一样,通过共享而不是复制来传递函数参数

您应该将
array
视为特定内存位的标签。如果函数
def(a)
使用名为
a
的变量,则无论何时调用
swap(some_variable)
,存储
some_variable
的内存都会在函数内部使用标签
a

这就是在您的示例中更改变量的原因。如果要保持
数组的原始值不变,需要先复制它,如下面的代码所示

    def swap(array, i):
        array[i], array[(i+1)%len(array)] = array[(i+1)%len(array)], array[i]
        return array 

因为列表是可变的。您将
array
作为一个列表传递,并执行交换操作,交换操作将对其进行修改。可能的重复项(有关问题的完整解释,请参阅接受的答案)列表是指向内存位置的指针。您需要执行复制操作,否则它将作用于相同的内存块,而不管它在哪个函数空间中。列表\副本=原始\列表[:]
def swap(original_array, i):
    # use list() return a copy of the list
    new_array = list(original_array)
    # do work on the copy of the list, which is a local var
    new_array[i], new_array[(i+1)%len(new_array)] = new_array[(i+1)%len(new_array)], new_array[i]
    # return the value of the local var
    return new_array 

# setup a list
a = [1,2,3,4]
# function still works
assert swap(a, 2) == [1,2,4,3]
# but it does not change the value passed to it
assert a = [1,2,3,4]
# and its local variable new_array is not available in this scope
assert 'new_array' not in dir()