0

だから私はすでに卒業し、私の計算機科学の学位のためにすべてのクレジットを受け取りました。しかし、私の前四半期の教授から、宿題の1つで何か面白いものが見つかったというメールが届きました。私は文脈を忘れていますが、それは重要ではないと思います。メール交換を投稿します。


差出人:教授
宛先:ME
件名:RE:LDA

こんにちは学生、
私はあなたの宿題の答えの1つに奇妙なことに気づきました:

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

これは機能しますが、何が問題になっていますか?


From:ME
To:PROF
Subject:RE:LDA

そうそう、私はCで考えていましたが、Pythonでは機能しませんでした:

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

その後、Pythonはスタック上のそのスワップを最適化し、tmp変数の必要性をまったく排除します。


差出人:教授
宛先:ME
件名:RE:LDA

それは本当ですが、より微妙な概念上の混乱があります

だから私の質問は:私はここで何が欠けているのですか?

4

4 に答える 4

7

swapPythonで呼び出す方法と、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スワップ関数が結果を割り当てずに2つの変数をスワップできない理由を説明できます。

于 2012-09-16T22:09:46.313 に答える
1

あなたの関数は複雑すぎるようです、確かにあなたはこれをすることができます

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

これは、たった1行のコードで同じことを達成しますか?

于 2012-09-16T22:11:44.093 に答える
1

彼が期待していたのは、Pythonのように交換する方法だけでした。

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 に答える