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)
您不了解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)
python按值传递,因此swap不会影响原始列表.只是用
list_[4], list_[2] = list_[2], list_[4]
Run Code Online (Sandbox Code Playgroud)