元のコードが機能することを期待する理由は、C++ などの言語での参照渡しに慣れているからだと思います。その場合、参照渡しと値渡しの違いを認識することが重要です。Python がどちらを使用しているかを理解することはさらに重要です。
要するに、Python は実際には参照渡しも値渡しも使用しません。受け渡しは、Python のオブジェクトを介して行われます。
長い答え:
値渡しの例は、C で作成できます。
#include <stdio.h>
void adding(int i) {
i = i + 1;
}
int main() {
int i = 0;
adding(i);
printf("i is %d\n", i); // will print "i is 0"
return 0;
}
ここで、 i の値はに渡されるときにコピーさadding()れます。int i内部
は、元の内部adding(int i)とは異なるメモリ位置にあります。そのため、 内では、のスコープ内でのみ既知のメモリ チャンク内の値にのみ影響します。イン
は別のメモリ チャンクに存在するため、まったく影響を受けません。int
imain()adding()i = i + 1adding()imain()
参照渡しの例は、C++ で作成できます。
#include <iostream>
void adding(int &i) {
i = i + 1;
}
int main() {
int i = 0;
adding(i);
std::cout << "i is " << i << std::endl; // will print "i is 1"
return 0;
}
ここでiは、 への参照によって渡されますadding()。iinsideは、 inadding()とまったく同じメモリのチャンクを参照します。したがって、1 にインクリメントされます。imain()i
さて、あなたの例に戻ってPythonについて話しましょう(あなたが実際に何を意味したかを推測して修正しました=]):
# Case 1
mylist = [1,2,3,4]
mylist.append(5) # will print [1,2,3,4,5]
# Case 2
mylist = [1,2,3,4]
def adding(mylist):
mylist.append(5)
adding(mylist)
print mylist # will print [1,2,3,4,5]
# Case 3
mylist = [1,2,3,4]
def adding(mylist):
mylist = mylist + [5]
adding(mylist)
print mylist # will print [1,2,3,4]
# Case 4
mylist = [1,2,3,4]
def adding(mylist):
mylist += [5]
adding(mylist)
print mylist # will print [1,2,3,4,5]
ここでmylistは、値でも参照でも渡されません。実際にはオブジェクトによって渡されます。
Python ではmylist = [1,2,3,4]、リストを作成し、それにタグ[1,2,3,4]を付け
ます。ここで注意すべき重要なことは、list が
オブジェクトであるということです (IIRC、すべてのオブジェクトは、またはその拡張です)。
mylistPyObject
この違いを理解すると、次の例の出力を理解できるようになります。
ケース 1では、リスト オブジェクトで直接.append()呼び出され[1,2,3,4]てリスト値が変更されるため、myobjectアタッチ先のオブジェクトが変更されています。Python ではリストが変更可能なオブジェクトであるため、これが可能であることに注意してください。
ケース 2では、mylistに渡す際にコピーされず、ケース 1adding()と同様に、同じリスト オブジェクトに「アタッチ」されます。したがって、
このオブジェクトを呼び出すと、オブジェクト自体が変更されます。の外では
、(オブジェクト自体が変更されていても) は同じオブジェクトにアタッチされているため、[1,2,3,4,5] という出力が得られます。.append()adding()mylist
ケース 3では、内部adding()で、ローカル変数mylistが によって作成された新しいオブジェクトにアタッチされ[1,2,3,4]+[4]ます。ただし、元のオブジェクトmylist
が指しているオブジェクトは変更されていないため、出力は のまま
[1,2,3,4]です。
ケース 4は少しトリッキーです。Python のリストは変更可能で、呼び出し元のオブジェクト自体に作用する の+=ようなショートカットとして機能します。.extend()したがって、元のオブジェクトは変更され[1,2,3,4,5]、mylistまだそれにアタッチされています。タプル、文字列、数値などの不変オブジェクトの場合、新しい+=オブジェクトを作成し、それに変数をアタッチすることにも注意してください。
Python でリストを使用するさまざまな方法については、Fredrik Lundh によって書かれたこの記事に非常に詳細な情報が含まれています。