したがって、関数では、セットに6を追加しても表示されませんが、関数にない場合は表示されますか?
いいえ、それは起こりません。
何が起こるかというと、を実行するmylist = mylist + [6]
と、まったく新しいリストが効果的に作成され、ローカルmylist
変数に入れられます。このmylist
変数は関数の実行後に消え、新しく作成されたリストも消えます。
OTOHを実行するmylist.append(6)
と、新しいリストは作成されません。mylist
すでに変数にリストを取得し、この同じリストに新しい要素を追加します。その結果、リスト(これもポイントされlist2
ます)自体が変更されます。mylist
変数は再び消えますが、この場合は元のリストを変更しました。
より視覚的な説明があなたを助けることができるかどうか見てみましょう:)
電話するとどうなりますかproc()
書くlist1 = [1, 2, 3, 4, 5]
ときは、新しいリストオブジェクト(等号の右側)を作成し、list1
このオブジェクトを指す新しい変数、を作成します。

次に、を呼び出すときにproc()
、別の新しい変数、を作成します。パラメータとしてmylist
渡すため、同じオブジェクトを指します。list1
mylist

ただし、この操作mylist + [6]
により、まったく新しいリストオブジェクトが作成されます。このオブジェクトの内容は、が指すオブジェクトの内容にmylist
加えて、次のリストオブジェクトの内容です。つまり、[6]
。この新しいオブジェクトをに帰するのでmylist
、シナリオは少し変わり、もうmylist
指している同じオブジェクトを指していlist1
ません。

私が言っていないのは、それmylist
がローカル変数であるということです。関数の終了後に消えproc()
ます。したがって、proc()
実行が終了すると、次のようmylist
になります。

によって生成されたオブジェクトを指す変数は他にないためmylist + [6]
、それも消えます(ガベージコレクター*がオブジェクトを収集するため)。

結局、が指すオブジェクトlist1
は変更されないことに注意してください。
電話するとどうなりますかproc2()
を呼び出すと、すべてが変わりますproc2()
。最初は同じです:リストを作成します...

...そしてそれをパラメータとして関数に渡します。関数はローカル変数を生成します:

+
ただし、新しいリストを生成する連結演算子を使用する代わりにappend()
、既存のリストにメソッドを適用します。このappend()
メソッドは新しいオブジェクトを作成しません; 代わりに、既存のものを_変更します。

関数の終了後、ローカル変数は消えますが、それとによって示される元のオブジェクトはlist1
すでに変更されています。

がまだポイントしているのでlist1
、元のリストは破棄されません。
編集:目の前で起こっているこれらすべてのことを確認したい場合は、この根本的に素晴らしいシミュレーターにアクセスしてください:

*ガベージコレクターとは何かわからない場合は...まあ、あなたはあなた自身の質問を理解した後すぐに発見するでしょう。