2016-12-07 14 views
0

コンピュータ科学者のように考える方法で次のコードが遭遇しました。誰も私に何が起こっているのか説明できますか? ここで私はそれを理解しようとしています。Pythonで2つの変数を交換しようとすると、奇妙な動作が発生する

(1):スワップ関数(より正確には、(x、y)=(y、x))はxとyの参照を入れ替えることです。

(2):関数swap(a、b)が呼び出されると、参照渡しされます。つまり、aとxは参照を共有し、yとbは参照を共有します。

(3):(1)と(2)に基づいて、xとyの参照を入れ替えるだけで、aとbでは何も変わりません。そのため、このスワップ機能は動作しません。

この理解が正しいかどうかは誰にでも分かりますか?

def swap(x, y):  # Incorrect version 
    print("before swap statement: x:", x, "y:", y) 
    (x, y) = (y, x) 
    print("after swap statement: x:", x, "y:", y) 

a = ["This", "is", "fun"] 
b = [2,3,4] 
print("before swap function call: a:", a, "b:", b) 
swap(a, b) 
print("after swap function call: a:", a, "b:", b) 
+0

あなたは 'X'と 'y'、ない' A'と 'B'を交換しています。これは「何かをする」とは考えられていません。それはあなたの質問に答えますか? – deceze

+0

これは可変スコープに関するものです。 'swap'の中の' x、y'はローカル変数なので、グローバル 'a、b'は変わりません。 – dragon2fly

+0

また、 'x、y = y、x'をかっこなしで使うことができます。 – Harvey

答えて

0

パラメータがPythonで参照渡しされるという問題は、完全に正確ではないということです。これは、例えばC++で起こるものとは非常に異なっています。

変数を定義するときは、基本的に、Pythonの名前が現在値にバインドされていることを伝えます。その値はPython VMに存在します。 a.append(4)bに影響を与える理由です[1,2,3]の同じ参照、に

a = [1,2,3] 
b = a 

両方abのポイント:あなたはこれを行うと。しかし、あなたは新しい値にbを再定義した場合、あなたはaが影響されないことがわかります:あなたはこれをしなかった場合は

b = "hello" 
print(a) # [1,2,3] 

、あなたはbが指す参照を変更しませんでした。 b[1,2,3]を指していましたが、現在は"hello"を指しているとPythonに伝えました。メモリ内のオブジェクト[1,2,3]と対話したことはありません。bという名前の場合のみです。あなたのswap関数の内部

あなたがx, y = y, xを行うときに、あなたはx名前は今yで開催された参照、およびその逆を指していることはPythonを教えてください。ただし、参照されている実際のオブジェクトはメモリ内でスワップされません。関数の外でabは、実際にはabの名前と相互作用していないため、同じ参照を指しています。

写真では、これが起こります。前:

Before swapping

後:

After swapping

+0

素敵な説明! – highsky

関連する問題