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

Python 适用于任何数据结构的交换方法,python,data-structures,arguments,pass-by-reference,pass-by-value,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]) 由于在函数调用过程中,list[4]和list[2]将被分配新值,因此我希望通过调用swap()更新扩展列表。但是,列表保持不变: list_ [5, 4, 6, 3, 7] 我误解了swap函数调用处理副本的原因。我不想向swap函数添加list参数

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

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

list_=[5,4,6,3,7]
swap(list_[4],list_[2])
由于在函数调用过程中,
list[4]
list[2]
将被分配新值,因此我希望通过调用
swap()
更新扩展列表。但是,
列表
保持不变:

list_
   [5, 4, 6, 3, 7]
我误解了swap函数调用处理副本的原因。我不想向swap函数添加list参数,也不想在swap()调用期间返回list,因为我希望该方法适用于其他数据结构,如

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

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


您已经了解了Python的工作原理:

list_=[5,4,6,3,7]
swap(list_[4],list_[2]) # this is absolutely the same as
swap(7,6)
Python的基本概念是使用名称和值。当您在代码中写下一个名称时,它代表运行时附加到它的值。在本例中,
list\u4]
是表示值
7
的名称

当你想改变某些东西时,你必须使用其中一个名字。在这里,您要更改
列表
,因此必须执行以下操作:

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

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

您想要做的事情在Python的模型中无法完成。我建议使用带有指针的语言。不知道为什么,但我刚刚在Python2.5 shell上尝试了您的代码,收到了奇怪的结果:
>>def swap(data,i1,1i2):。。。数据[i1],数据[i2]=数据[i2],数据[i1]…>>listy=[1,2,3,4,5]>>>交换(listy,listy[0],listy[3])>>>listy[1,5,3,4,2]
为什么交换索引1和4处的元素??有人想解释一下吗?@WeaselFox:与OPs示例中的相同:
listy[0]
是1,
listy[3]
4
所以它交换这些索引。还可以对内置的
list
类型进行子类化,并添加一个
swap()
方法,该方法将有一个初始的
self
参数——只需输入即可。@WeaselFox:pass 0和3,不使用括号[0]和列表[3]:)看起来更好。Python按值传递是不正确的。因为如果我们传递一个列表,它是通过引用传递的。事实上,它取决于传递的对象是可变的还是不可变的。更现实的方法是将变量名视为如上所述的标记。发送“按引用”的想法有时看起来像是发送“按值”:@ovgolovin这种方法不太清楚为什么我的列表标记列表_uuin参数在对其元素调用交换操作时不受影响。列表是可变结构:那个么传递可变参数结构和不可变参数结构有什么不同呢?在这两种情况下,它都不会影响结构(不可变,可能会引发异常),我保留了JBernardo和julio的答案anyway@dlib在您的问题中,您将两个整数发送到
swap
list\u4]
list\u2]
。然后在
swap
中进行一些赋值,将变量
a
b
重新绑定到内存中的新地址。因此,在
swap
函数之外没有任何更改。但是,如果像Jochen Ritzel那样将整个列表作为参数发送到
交换
,则可以更改此列表中的内容。如果您仔细查看Jochen Ritzel的答案,您会发现他没有在
swap
函数内部重新分配
data
,因此
data
指向从外部发送到
swap
的列表。
def swap(data, i1, i2):
    data[i1], data[i2] = data[i2], data[i1]

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