Python 为什么我的互换功能互换到位?
为什么我的交换功能在适当的位置交换? 我的意思是,在交换函数中,“array”是局部变量,我交换局部变量的元素并返回“array”,那么为什么在我传递的列表中进行更改。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
例如,如果在调用
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()