为什么我的交换功能交换是到位的?

2024-03-28 20:42:09 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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


Tags: 函数功能元素列表lenreturndefarray
1条回答
网友
1楼 · 发布于 2024-03-28 20:42:09

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

您应该将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()

相关问题 更多 >