简单的python交换,概念混乱

时间:2012-09-16 22:04:34

标签: python

所以我已经毕业并获得了compci学位的所有学分。但是我上个季度的教授给我发了一封电子邮件,说他在我的一份家庭作业中找到了一些有趣的东西。我忘记了背景,但我认为这不重要。我会发布电子邮件交流。

<小时/> 来自:PROF
致:ME
主题:RE:LDA

嗨,学生,
我在你的一个作业答案中发现了一些奇怪的东西:

def swap(i,j):
    tmp = i
    i = j
    j = tmp
    return i,j

这有效,但它有什么问题?

<小时/> 来自:ME
致:PROF
主题:RE:LDA

哦,是的,我在用C思考,不会在python中工作:

def swap(i,j): 
    i,j = j,i
    return i,j
然后,Python将优化堆栈上的交换,完全不需要tmp变量。

<小时/> 来自:PROF
致:ME
主题:RE:LDA

这是真的,但存在更微妙的概念混淆

所以我的问题是:我在这里缺少什么?

4 个答案:

答案 0 :(得分:7)

考虑如何在Python中调用swap,而不是如何在C中调用交换函数。

例如,在C中,

swap(&a, &b);

有效并将a中的内存与b中的内存交换(假设swap的实现正确)。

但是,在Python中,

swap(a, b)

......什么都不做!您必须分配结果:

a,b = swap(a,b)

但是你为什么不这样做呢?

a,b = b,a

并完全抛弃swap()函数?

如果你真的了解Python和C之间的区别,你将能够解释为什么Python交换函数在不分配结果的情况下不能交换两个变量。

答案 1 :(得分:1)

你的功能似乎过于复杂,当然你可以这样做

def swap(i,j):    返回j,我

只用一行代码就可以实现同样的目的吗?

答案 2 :(得分:1)

他所期待的只是交换的pythonic方式:

i, j = j, i

答案 3 :(得分:0)

我想他的观点是,在函数内部根本不需要进行交换 - 因为函数的返回值与传入的值没有关联,所以这也可以这样做:

def swap(i, j):
    return j, i

事实上,拥有该功能毫无意义,它根本不添加任何东西。您必须致电i, j = swap(i, j) - 这与j, i = i, j完全相同。