交换方法适用于任何数据结构

时间:2012-02-05 15:09:13

标签: python data-structures arguments pass-by-reference pass-by-value

我在使用Python

实现自己的swap()方法时遇到了这个问题
def swap(a,b):
    temp=a
    a=b
    b=temp

list_=[5,4,6,3,7]
swap(list_[4],list_[2])

由于swap()list_[4]将在函数调用期间分配新值,因此我通过list_[2]调用更新了list_。但是,list_保持不变:

list_
   [5, 4, 6, 3, 7]

我误解了为什么交换函数调用正在处理副本。我不想在我的交换函数中添加一个列表参数,也不想在swap()调用期间返回列表,因为我希望该方法适用于其他数据结构,例如

 swap(mat[0][1],mat[2,3])

2 个答案:

答案 0 :(得分:8)

你对Python的运作方式不感兴趣:

list_=[5,4,6,3,7]
swap(list_[4],list_[2]) # this is absolutely the same as
swap(7,6)

Python的基本概念是使用名称和值。当您在代码中记下名称时,它代表运行时附加到它的值。在这种情况下,list_[4]是代表值7的名称。

如果您想要更改某些内容,则必须使用其中一个名称。在这里,您要更改list_,因此您必须执行此操作:

def swap(data, i1, i2):
    data[i1], data[i2] = data[i2], data[i1]

swap(list_, 4,2) # swaps list index 4 and 2

答案 1 :(得分:5)

python按值传递,因此交换不会影响原始列表。 只需使用

list_[4], list_[2] = list_[2], list_[4]