所以我已经毕业并获得了compci学位的所有学分。但是我上个季度的教授给我发了一封电子邮件,说他在我的一份家庭作业中找到了一些有趣的东西。我忘记了背景,但我认为这不重要。我会发布电子邮件交流。
<小时/> 来自:PROF
嗨,学生,
我在你的一个作业答案中发现了一些奇怪的东西:
def swap(i,j):
tmp = i
i = j
j = tmp
return i,j
这有效,但它有什么问题?
<小时/> 来自:ME
哦,是的,我在用C思考,不会在python中工作:
def swap(i,j):
i,j = j,i
return i,j
然后,Python将优化堆栈上的交换,完全不需要tmp变量。
<小时/> 来自:PROF
这是真的,但存在更微妙的概念混淆
所以我的问题是:我在这里缺少什么?
答案 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
完全相同。