質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

3回答

1392閲覧

pythonのクラスについて

lemon0416

総合スコア9

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/08/23 10:12

python3

1class Sample: 2 3 c_list = [] 4 5 def add_c_list(self,data): 6 self.c_list.append(data) 7 8print("出力結果:", end=" ") 9sample1 = Sample() 10sample1.add_c_list("データ1") 11 12sample2 = Sample() 13sample2.add_c_list("データ2") 14 15for item_data in sample1.c_list: 16 print(item_data, end=" ")

この場合、出力結果が
出力結果: データ1 データ2
となるのはなぜですか?
sample1,sample2でそれぞれインスタンス化しているから、sample1でadd_c_listをしたら、sample1だけに存在するようになるんじゃないんでしょうか?つまり、インスタンス同士で独立してないのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

変数の定義と変数の参照が違うことを理解すれば、この理由はわかります。

python

1x = 1 2def func(): 3 print(x)

の関数内には変数xのグローバル宣言はありませんが、変数xを参照しているのでグローバル変数xを参照します。

pythonx

1def func(): 2 x = 42 3print(x)

の関数内には変数xのグローバル宣言なしで変数xを定義しようとしているので、ローカル変数xに42が代入されます。

pythonx

1def func(): 2 x += 4 3 4print(x)

の関数内には変数xのグローバル宣言なしで変数を更新しようとしています。更新は参照と定義を行うので、xはローカル変数であると見なされ、参照しようとした時点でローカル変数xが定義されていないためエラーになります。

変数の値がミュータブルなコンテナ型のオブジェクトである場合を考えてみましょう。

python

1x = [1] 2def func(): 3 x.append(42) 4 5print(x)

この場合、関数内の変数xはグローバル宣言はありません。しかし、変数xの値であるリストオブジェクトを変更するという処理は、変数xの値を更新する処理ではありません。つまり変数xは参照されていますが、更新はされていません。更新されているのは変数xの値であるリストオブジェクトです。そのため、このコードはエラーにならずに実行され、関数の外にでたあと、関数内での更新は反映されます。

このあたりの話は公式ドキュメント 実行モデル 4.2. 名前づけと束縛 (naming and binding)を読んでください。

lemon0416さんのコードはこれと同じで、メソッド内のself.c_listは変更されていないので、クラス変数の参照となります。self.c_listの値であるるリストオブジェクトの変更は、クラス変数の値の話ですのでsample1.c_listを見れば"データ1"も"データ2"も入っているのです。

投稿2021/08/23 14:54

ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lemon0416

2021/09/03 12:35

助かりました。 ありがとうございます!!
guest

0

質問のコードにあるクラスの変数 c_list はクラス変数になっています。想定している「インスタンス同士で独立」した変数はインスタンス変数と言います。
定義の志鷹の違いについては、「python クラス変数 インスタンス変数」で検索すればいろいろ説明が出てきますのでそちらを参照してください。

投稿2021/08/23 10:32

TakaiY

総合スコア12779

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Pythonの場合、存在しないインスタン変数を参照した場合、同名のクラス変数があるとそれを参照するようです。
ちょうど、存在しないローカル変数を参照した場合、同名のグローバル変数があるとそれを参照するのと、同じような感じですね。

インスタンス変数を定義すれば、インスタンス毎に別れます。

Python

1class Sample: 2 3 c_list = [] #これはクラス変数 4 def __init__(self): 5 self.c_list = [] #これはインスタンス変数 6 7 def add_c_list(self,data): 8 self.c_list.append(data)

投稿2021/08/23 10:31

otn

総合スコア84645

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問