元のコードが機能することを期待する理由は、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
i
main()
adding()
i = i + 1
adding()
i
main()
参照渡しの例は、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()
。i
insideは、 inadding()
とまったく同じメモリのチャンクを参照します。したがって、1 にインクリメントされます。i
main()
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、すべてのオブジェクトは、またはその拡張です)。
mylist
PyObject
この違いを理解すると、次の例の出力を理解できるようになります。
ケース 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 によって書かれたこの記事に非常に詳細な情報が含まれています。