2012-09-16 70 views
0

所以我已經畢業並獲得了所有學分我的compsci學位。但是我上個季度的教授給我發了一封電子郵件,說他在我的一項家庭作業中發現了一些有趣的事情。我忘記了上下文,但我認爲它不重要。我會發布電子郵件交換。python中的簡單交換,概念上的混淆


來源:潘宗光
要:ME
主題:RE:LDA

喜的學生,
我注意到一個奇怪的現象在你的作業答案之一:

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

該作品,但是它有什麼問題?


來源:ME
要:潘宗光
主題:RE:LDA

哦,是啊,我是用C的思維,是不是在Python的工作要做:

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

Python會然後在堆棧上優化交換,完全不需要tmp變量。


來源:潘宗光
要:ME
主題:RE:LDA

這是真的,但有一個更微妙的概念上的混淆

所以我的問題是:什麼我在這裏失蹤?

+2

'復位J,i'是他想大概是什麼。 –

+0

嗯,我希望這不是那麼容易... – user1676273

+2

我認爲你的教授完全質疑'swap'的效用。 – nneonneo

回答

7

想想你會怎麼稱呼swap在Python中,對你會怎麼稱呼一個交換功能在C.

例如,在C,

swap(&a, &b); 

是有效的,在交換的a內存與內存在b(假設執行swap是對的)。

但是,在Python,

swap(a, b) 

...什麼也不做!你必須分配結果:

a,b = swap(a,b) 

但後來你爲什麼不只是做

a,b = b,a 

和溝互換()函數完全?

如果您真的瞭解Python和C之間的區別,您將能夠解釋爲什麼Python交換函數無法在不分配結果的情況下交換兩個變量。

0

我猜他的觀點是,在函數內部有沒有必要做掉的話 - 因爲函數的返回值不依賴於傳遞的值,因此這將做的一樣好:

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

所以實際上這個功能沒有意義,它根本沒有添加任何東西。您必須致電i, j = swap(i, j) - 與j, i = i, j完全相同。

+0

請注意,'j,i = swap(i,j)'相當於'j,i = j,i',一個無操作... – nneonneo

+0

糟糕,已更正。 –

1

您的功能似乎過於複雜,當然,你可能只是這樣做

高清互換(I,J): 回J,I

這將實現只有一行的代碼是一回事嗎?

+2

是的,但爲什麼有'swap'功能呢? – nneonneo

1

他所期待是交換Python的方式:

i, j = j, i