Python関数パラメーターの受け渡しの混乱

私はPythonを体系的に研究していないので、多くの知識ポイントが壊れており、全体として形成することはできません。私はいつも他の言語を使ってPythonの構文を比較するのが好きです。たとえば、パラメータの受け渡しについては、PythonはC ++のように値の受け渡し参照の受け渡しに分けられるといつも感じています誤ってブログの投稿を見て、実際にはまったく違うことに気づきました。

まず、Pythonの関数パラメーターの受け渡しでは、値の受け渡しと参照の受け渡しに違いはありません。これは、参照による受け渡しの呼び出しメソッドがまったくないためです。

第二に、それがすべて値の受け渡しであっても、Pythonの値の受け渡しはC ++の値とは異なります。C ++の値転送方法に疑いはありません。実際のパラメーターの値は、関数呼び出し後に変更されませんPythonの値転送メソッド(这里姑且还是这样称呼它为值传递)では、関数が呼び出された後、実際のパラメーターが変更または変更されない場合があります。次の例を見てみましょう。

# 例子1
def test_int(input_value):
    input_value = 2

one_value = 1
test_int(one_value)
print('one_value = {
    
    }'.format(one_value))

例1の出力はone_value = 1次のとおりです。例1の出力は理解しやすいですが、以下の例2はどうでしょうか。

# 例子2
def test_list(input_list):
    input_list.append(3)

one_list = [1, 2]
test_list(one_list)
print('one_list = {
    
    }'.format(one_list))

例2の出力は次のとおりone_list = [1, 2, 3]です。なぜ結果が異なるのですか?

実際、Pythonでは、型はオブジェクトに属し、変数には型がありません。変数はオブジェクトを指すだけです。パラメーターが渡された後、変数one_valueとinput_valueは両方ともオブジェクト1を指します。参照できます。次のテクスチャ:
ここに画像の説明を挿入
(2と3これらのオブジェクトはすべて、効率のために事前に作成されたシステムです)。以来、test_int()機能体へのニーズ变量input_valueオブジェクト2をポイントし、次に1が直接(定数オブジェクトとして理解することができる)対象物2に変換できないオブジェクトは、変数input_valueは、オブジェクト2、次いで全体を指すように変更することができますオブジェクト構造は次のようになります。形式:
ここに画像の説明を挿入
したがって、関数呼び出しが戻ると、変数one_valueinput_valueは異なるオブジェクト指します。したがって、変数one_valueの値は変更されません。

例2では、​​変数one_listinput_list両方が同じリストオブジェクトを指しています。
ここに画像の説明を挿入

リストオブジェクト自体は変更できることに注意してください。要素を追加してもオブジェクトは再作成されませんが、元のオブジェクトに直接新しい要素が追加されますしたがって、呼び出しtest_func2()後のオブジェクト構造は次のようになります。
ここに画像の説明を挿入

one_listまたinput_list、同じオブジェクトをポイントしている場合でも、ポイントされたオブジェクトinput_listの値を変更するとone_list、そのオブジェクトが間接的に変更されます。

最終的な分析では、関数が呼び出された後、仮パラメーターが別のオブジェクトを指すようになっている場合、仮パラメーターの変更は実際のパラメーターに影響しません。仮パラメーターの変更が元のポインティングで直接操作されている場合オブジェクトの場合、仮パラメータは引き続き同じオブジェクトを指し、仮パラメータの変更は実際のパラメータに同期されます。

または、関数パラメータの受け渡しは、分割する必要が不可变对象传递あり可变对象传递strings, set, tuples, numbers変更されることはないlist,dictため、オブジェクトを変更できます。関数呼び出しが不変オブジェクトとして渡される場合、仮パラメーターが関数本体で変更されても、関数呼び出しが戻ったときに実際のパラメーターの値は変更されません。関数呼び出しが可変オブジェクトとして渡される場合、仮パラメーターはパラメータと実際のパラメータは関数本体で変更されます。フォローして変更されます。

上記の理由を理解すると、次の状況も理解しやすくなります。

# 例子3
def test_tuple(input_tuple):
    input_tuple += (3, 4)

one_tuple = (1, 2)
test_tuple(one_tuple)
print('one_tuple = {
    
    }'.format(one_tuple))

例3の出力はone_tuple = (1, 2)です。

おすすめ

転載: blog.csdn.net/xp178171640/article/details/115144126