Python简单交换函数

试图学习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个swap0 。似乎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

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


实际上,您的最终print将打印出s1s2的原始值。 这是因为你只是在功能范围内交换它们。 这样做不会影响它们在函数外的值(即在函数调用后它们的值之后)

如果他们是可变类型( listsetdict等),那么你可以在swap内就地修改它们。 但是,这限制了swap仅适用于可变类型。

因此,您最好以相反的顺序返回输入:

def swap(s1, s2):
    return s2, s1

s1 = 'a'
s2 = 'b'
s1, s2 = swap(s1, s2)
print s1, s2 # prints 'b a'

当然,你可以在一行中做到这一点,如下所示:

s1, s2 = s2, s1

干杯!


其他答案解释发生了什么问题。 这是一个你想要的版本:

def swap(s1, s2):
    assert isinstance(s1, list) and isinstance(s2, list)
    s1[:], s2[:] = s2[:], s1[:]

另请参阅:isinstance与类型

链接地址: http://www.djcxy.com/p/54237.html

上一篇: Python Simple Swap Function

下一篇: Handle either a list or single integer as an argument