まず例を見てみましょう:
# -*- coding: UTF-8 -*- def chagne_number( b ): b = 1000 b = 1 chagne_number(b) print( b )
最終的な出力結果は次のとおりです:
1
ここで疑問を持つ人もいるかもしれません。なぜ b の値は関数 chagne_number で変更されないのでしょうか?変化がなく、出力結果が 1 のままなのはなぜですか? この問題は多くのプログラミング言語で議論されており、原理の説明も同様です。
これは主に、型オブジェクトである関数パラメータの転送についてです。Python の基本的なデータ型も以前に紹介しました。これらの型オブジェクトは、変更可能な型と変更不可能な型に分類できます。
Python では、文字列、整数、浮動小数点型、タプルは変更できないオブジェクトですが、リスト、辞書などは変更できます。
例:
変更不可能な型: 変数の代入 a = 1 は、実際には整数オブジェクト 1 を生成し、変数 a は 1 を指します。 a = 1000 の場合、実際には、別の整数オブジェクト 1000 を生成し、次に a の点を変更して、整数オブジェクト 1 を指すのではなく 1000 を指すようにします。最終的に 1 は破棄されます。
Changeable type: 変数の割り当て a = [1,2,3,4,5,6] はオブジェクト リストを生成します。リストには 6 つの要素があり、変数 a はリストを指します。a[2] = 5 はリスト a の 3 番目の要素を変更します。ここでの要素値の変更は上記とは異なり、a をリダイレクトするのではなく、リスト内の要素の値を直接変更します。
これは、関数でのパラメータの受け渡しにも影響します:
変更不可能な型: C の値の受け渡しと同様、次のようになります。整数、文字列、タプル。たとえば、 fun(a) は a の値を転送するだけで、 a オブジェクト自体には影響しません。たとえば、 fun(a) 内の a の値を変更すると、コピーされた別のオブジェクトが変更されるだけで、 a 自体には影響しません。
変更可能なタイプ: リストや辞書など、C に似た参照の受け渡し。例えば fun (a) の場合、実際には a が渡されますが、変更すると外部の fun も影響を受けます
したがって、最初の例では、b = 1 として、整数オブジェクト 1 が作成されます。 , 変数 b がこのオブジェクトを指しており、関数 chagne_number を渡すと、変数 b が値によってコピーされます。渡されるのは b の値のみであり、b 自体には影響しません。詳細については、変更後の例を確認し、印刷結果を確認することでよりよく理解できます。
# -*- coding: UTF-8 -*- def chagne_number( b ): print('函数中一开始 b 的值:{}' .format( b ) ) b = 1000 print('函数中 b 赋值后的值:{}' .format( b ) ) b = 1 chagne_number( b ) print( '最后输出 b 的值:{}' .format( b ) )
出力結果:
函数中一开始 b 的值:1 函数中 b 赋值后的值:1000 最后输出 b 的值:1
もちろん、パラメータが変更可能な型の場合、この関数を呼び出した後、元の値も変更されます。具体的な例は次のとおりです:
# -*- coding: UTF-8 -*- def chagne_list( b ): print('函数中一开始 b 的值:{}' .format( b ) ) b.append(1000) print('函数中 b 赋值后的值:{}' .format( b ) ) b = [1,2,3,4,5] chagne_list( b ) print( '最后输出 b 的值:{}' .format( b ) )
出力結果:
函数中一开始 b 的值:[1, 2, 3, 4, 5] 函数中 b 赋值后的值:[1, 2, 3, 4, 5, 1000] 最后输出 b 的值:[1, 2, 3, 4, 5, 1000]次のセクション