为什么交换功能交换到位?

时间:2017-06-30 15:34:36

标签: python python-2.7 python-3.x

    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'?

1 个答案:

答案 0 :(得分:1)

与许多面向对象语言一样,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()