def swap(array, i):
array[i], array[(i+1)%len(array)] = array[(i+1)%len(array)], array[i]
return array
为什么我的交换功能交换到位?
我的意思是在交换函数'数组'是局部变量,我交换局部变量的元素并返回'数组'然后为什么在我传递的列表中进行更改。
例如,如果在调用a = [1,2,3,4]
之后我有一个列表swap(a,0)
,它应该返回它所做的[2,1,3,4]
,但它也会修改我传递的列表'a'?
答案 0 :(得分:1)
您应该将array
视为特定内存位的标签。如果您的函数def f(a)
采用名为a
的变量,则无论何时调用swap(some_variable)
,存储some_variable
的内存都会在您的函数内可用,标签为a
。
这就是为什么在您的示例中更改变量的原因。如果您想保持原始值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()