我在尝试学习 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
函数中给s1
和s2
赋了新的值。这些赋值不会在函数外传播。如果您只是复制函数体并将其粘贴到函数调用的位置,您会发现它有效。
您可以通过修改参数引用的对象而不是参数本身来解决此问题:
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/