2: 2017-09-04 (月) 09:25:33 njf |
現: 2017-09-04 (月) 20:32:24 njf |
| x = x + 1 | | x = x + 1 |
| print x | | print x |
| + | |
| y = 1 | | y = 1 |
| + | |
| addOne(y) | | addOne(y) |
| + | |
| print y | | print y |
| | | |
| l[0] = l[0] + 1 | | l[0] = l[0] + 1 |
| print l | | print l |
- | | + | |
| + | |
| m = [0,1,2,3] | | m = [0,1,2,3] |
| + | |
| addOneList(m) | | addOneList(m) |
| + | |
| print m | | print m |
| | | |
| なぜこのような仕組みがあるか理解するには、値渡し、参照渡しそれぞれの利点、難点を知る必要があります。 | | なぜこのような仕組みがあるか理解するには、値渡し、参照渡しそれぞれの利点、難点を知る必要があります。 |
| | | |
- | 値渡しは引数で与えられた変数の中身をコピーし、新しい変数に入れかえています。そのため、関数内の変数が他の部分と独立しており、関数外に影響を与えないことから、プログラムの管理が楽になります。しかし、一方で変数のコピーは負荷の高い処理のため、特に大きなデータの場合には処理が遅くなります。 | + | 値渡しは引数で与えられた変数の中身をコピーし、新しい変数に入れかえています。そのため、関数内の変数がプログラムの他の部分と独立しており(スコープが異なり)、関数外に影響を与えないことから、プログラムの管理が楽になります。しかし、一方で変数のコピーは負荷の高い処理のため、特に大きなデータの場合には処理が遅くなります。 |
| | | |
| 参照渡しは引数のデータをコピーせずにそのまま使い回すため、どれだけ大きなデータを引数としてもパフォーマンスにはほとんど影響しません。一方で個々の関数内でデータを書きかえられるため、プログラムのどこでデータが変更されたかを管理するのは難しくなります。実際、参照渡しの変数をうっかり書きかえてしまうことによるバグは、初心者がかならず経験するものの一つです。 | | 参照渡しは引数のデータをコピーせずにそのまま使い回すため、どれだけ大きなデータを引数としてもパフォーマンスにはほとんど影響しません。一方で個々の関数内でデータを書きかえられるため、プログラムのどこでデータが変更されたかを管理するのは難しくなります。実際、参照渡しの変数をうっかり書きかえてしまうことによるバグは、初心者がかならず経験するものの一つです。 |
| このような利点、難点があり、それぞれの利点を有効に利用するため、多くのプログラム言語ではデータの小さい変数型は値渡し、データが大きくなる可能性のある変数型は参照渡しとする言語仕様が採用されています。 | | このような利点、難点があり、それぞれの利点を有効に利用するため、多くのプログラム言語ではデータの小さい変数型は値渡し、データが大きくなる可能性のある変数型は参照渡しとする言語仕様が採用されています。 |
| | | |
- | その意味では文字列型は参照渡しの方が良さそうですが、Pythonでは言語仕様を簡単にするためか、値渡しとなっているので、大きな文字列をあつかうときには処理が遅くなりがちで注意が必要です。 | + | その意味では文字列型は参照渡しの方が良さそうですが、Pythonでは言語仕様を簡単にするためか、値渡しとなっています。大きな文字列をあつかうときには処理が遅くなりがちなので注意が必要です。 |
| | | |
| Pythonで大きな文字列を頻繁に編集する場合には、リストに変換することなどが常套手段とされています。 | | Pythonで大きな文字列を頻繁に編集する場合には、リストに変換することなどが常套手段とされています。 |