Python 简单交换函数

标签 python swap

我在尝试学习 python 时遇到了这个问题。考虑以下功能:

def swap0(s1, s2):
    assert type(s1) == list and type(s2) == list
    tmp = s1[:]
    s1 = s2[:]
    s2 = tmp
return

s1 = [1]
s2 = [2]
swap0(s1, s2)
print s1, s2

s1 和 s2 会打印什么?

运行题后发现print语句会打印1 2,看来s1和s2的值从swap0函数中没有变化。我能想到的唯一解释是因为这条线。

tmp = s1[:]

因为 s1[:] 是一个副本,所以 s1 的值在函数调用中不会改变是有道理的。但是因为swap0的参数是(s1, s2),所以我不确定tmp = s1[:]后是否。任何时候我做

s1 = something...

它将是对 s1 副本的引用,而不是 s1 本身。有人可以提供更好的解释吗?谢谢。

最佳答案

这是因为它在swap0 函数中给s1s2 赋了新的值。这些赋值不会在函数外传播。如果您只是复制函数体并将其粘贴到函数调用的位置,您会发现它有效。

您可以通过修改参数引用的对象而不是参数本身来解决此问题:

def swap0(s1, s2):
    assert type(s1) == list and type(s2) == list
    tmp = s1[:]
    s1[:] = s2
    s2[:] = tmp

但是,在 Python 中进行交换的更简单和更好的方法很简单:

s1, s2 = s2, s1

这也只会交换对列表的那些特定引用,而不是列表内容本身。

关于Python 简单交换函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13167300/

相关文章:

python - CSV 以字节形式返回而不是字符串 Python

linux - 如何找出 Linux 中哪些进程正在使用交换空间?

c++ - 在 C++ 中使用指令与使用声明交换

python - 这是将两个字典的字典合并在一起并对相似值求和的最佳方法吗

python - 使用特定像素边距 numpy opencv 从图像中剪切蒙版

python - Altair:如何向包含行的条形图添加标签

python - 截断的 SVD 需要很多时间

Javascript - 从一种 switch 语句情况到另一种 switch 语句

c - 交换钉跳拼图时的逻辑错误

linux - 为什么需要在 Datastax Cassandra 中关闭交换?