0

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


发件人: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

4 回答 4

7

想想如何swap在 Python 中调用,与如何在 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 的交换函数不能在不赋值的情况下交换两个变量。

于 2012-09-16T22:09:46.313 回答
1

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

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

只用一行代码就可以达到同样的效果?

于 2012-09-16T22:11:44.093 回答
1

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

i, j = j, i
于 2012-09-16T22:15:55.303 回答
0

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

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

所以实际上拥有这个功能没有意义,它根本没有添加任何东西。你必须打电话i, j = swap(i, j)- 这与j, i = i, j.

于 2012-09-16T22:09:51.660 回答