可変オブジェクトと非可変オブジェクト


前の記事「pythonでの付与値の伝達?」で、メソッド呼び出し時にメソッド内部と出力idが同じなので、公式の言葉は理解できません
Remember that arguments are passed by assignment in Python.Pythonのパラメータは付与によって伝達されることを覚えておいてください.
その後もメモリシミュレーションから理解しました.実は私は少し間違っています.公式の話は大丈夫です.私の論証の姿勢は間違っています.2つの場所でidを出力するのは同じで、pythonが値を伝えるのか、アドレスを伝えるのかは説明できません.公式には伝値しかないと言われていますが、反論するには、メソッドを呼び出す場所とメソッドの内部で、値を出力しなければなりません.2つの場所の値が異なるのが正しい反論姿勢です.id()メソッドを呼び出すのは、メモリアドレスを出力するだけで、2つのメモリアドレスは同じで、pythonが値を伝達していないことを説明することはできません.
では、ここでは、list、set、dict、カスタムオブジェクト、int、float、str、bool、tupleなど、可変オブジェクトと可変オブジェクトについて説明します.可変オブジェクトステップでは、自分の内容を変更できます.可変オブジェクトをキューに入れて値を割り当てると、実際には新しいオブジェクトが生成され、変数がこのオブジェクトを指すようになります.たとえこのオブジェクトが0と1の数字にすぎないとしても
    a=0
    print('a',id(a))
    a=1
    print('a',id(a))

出力:
    a 4453151440
    a 4453151472

オブジェクトは可変ではないため、pythonは効率を向上させるために共通のオブジェクトを使用します.たとえば、
a=1
print('a',id(a))
b=1
print('b'),id(b))
print(a==b)
print(a is b )
c='hello world'
print('c',id(c))
d='hello world'
print('d',id(d))
print(c==d)
print(c is d)

出力:
    a 442376776
    b 442376776
    True
    True
    c 4430180912
    c 4430180912
    True
    True

Tips:isというオペレータは、同じオブジェクトであるか、すなわちアドレスが一致しているかを判断します.==オペレータは、[値](Value)が等しいかどうかのみを判断します.
リストオブジェクトのコピーを生成する必要がある場合は、[:]を使用して、同じオブジェクトではないため、コピーに変数を付与して変更しても、前のリストには影響しません.
では、以下をご覧ください.
    m=[1,2,[3]]
    n=m[:]
    n[1]=4
    n[2][0]=5
    print(m)

出力結果は[1,2,5]ですが、なぜそうなるのでしょうか.オブジェクトの割り当ては浅いコピーによって行われるからです.