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

kir*_*off 0 python arguments pass-by-reference pass-by-value data-structures

我在swap()使用Python 实现自己的方法时遇到了这个问题

def swap(a,b):
    temp=a
    a=b
    b=temp

list_=[5,4,6,3,7]
swap(list_[4],list_[2])
Run Code Online (Sandbox Code Playgroud)

我expexted list_与更新swap()的呼叫,因为list_[4]list_[2]对函数调用期间被分配新值.但是,list_保持不变:

list_
   [5, 4, 6, 3, 7]
Run Code Online (Sandbox Code Playgroud)

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

 swap(mat[0][1],mat[2,3])
Run Code Online (Sandbox Code Playgroud)

Joc*_*zel 8

您不了解Python的工作原理:

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

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
Run Code Online (Sandbox Code Playgroud)

  • @WeaselFox:与OPs示例相同:`listy [0]`为1,`listy [3]`为`4`,因此它交换这些索引. (2认同)

Wea*_*Fox 5

python按值传递,因此swap不会影响原始列表.只是用

list_[4], list_[2] = list_[2], list_[4]
Run Code Online (Sandbox Code Playgroud)