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

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

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

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

Q&A

解決済

2回答

184閲覧

クラスインスタンスについて

nobodytolove123

総合スコア61

Python 3.x

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

0グッド

0クリップ

投稿2019/05/06 10:59

編集2019/05/06 11:00

##概要

いつもお世話になっております。

現在、Python 3 エンジニア認定基礎試験なるものの学習を行っていて
模擬問題を解いている最中なのですが、理解出来ない問題があったので
ご教授いただければ幸いです。

下記に問題の一例を記載します。
問題については、念のため一部変更しています。

以下のプログラムを実行した際の出力結果を回答しなさい。

py

1class C: 2 member = [] 3 4 def append(self, data): 5 self.member.append(data) 6 7 8instance1 = C() 9instance1.append("1") 10 11instance2 = C() 12instance2.append("2") 13 14for data in instance1.member: 15 print(data, end = " ") 16

この問題の答えは正解は1 2です。

僕の考えではinstance1instance2の二つのインスタンスを生成した場合
メンバ変数となるmemberがそれぞれ別のオブジェクトとして生成されていると思ったのですが
どうやら違ったようなので、ご教授お願い致します。

##環境情報
Python 3.6.5

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

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

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

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

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

guest

回答2

0

ベストアンサー

memberはメンバ変数ではありません。クラス変数です。
クラス変数はそのクラスで生成された全てのオブジェクトで共有されます。ですので1 2が出力されます。
メンバ変数はself.識別名で宣言しなければなりません。

投稿2019/05/06 11:15

Romira

総合スコア47

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

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

nobodytolove123

2019/05/06 11:39

ご回答ありがとうございます。 僕の認識がそもそも間違っていました、クラス変数はインスタンス間で共有されるものなのですね。 ご教授ありがとうございます。 僕の手元で検証して少し気になる点があったので、差し支えなければ追加でご質問させて頂きたいですが instance1のクラス変数に例えばNoneを再代入した場合、instance2のクラス変数はNoneにはならないのですが、クラス変数は変数そのものが上書きされた場合、インスタンス間では共有されない認識であっていますかね。 下記検証結果です。 https://paiza.io/projects/2YXnaItors28pIPwtolHUw?language=python3
Romira

2019/05/06 11:57

クラス変数は正しくは、クラス名.識別子でアクセスしなければなりません。しかしながらインスタンス名.識別子でもアクセスできてしまうので今回の質問内容のソースコードでも実行できてしまいます。 さてリンク先のソースコードを拝見しましたが、第8行でself.mylistとしてしまっているのでこれはメンバ変数として扱われます。これをC.mylistとすることで意図する動作になると思われます。
nobodytolove123

2019/05/06 12:33

ご回答ありがとうございます。 本来の使い方としてクラス名.識別子が正しい使い方なのですね。 とても勉強になりました、ありがとうございます!
guest

0

僕の考えではinstance1、instance2の二つのインスタンスを生成した場合
メンバ変数となるmemberがそれぞれ別のオブジェクトとして生成されていると思ったのですが

合ってなかった・・・その認識で合ってますよ。

memberは、class変数として定義されているため、全てのインスタンスで共通の領域となります。
よって、結果は1 2 となります。

投稿2019/05/06 11:06

編集2019/05/06 11:30
Y.H.

総合スコア7914

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

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

nobodytolove123

2019/05/06 11:28 編集

ご回答ありがとうございます! Romiraさんの回答を参考にクラス変数について調べたところ、下記の記載がありました。 --- クラス変数とは、インスタンス化せずに使用可能な変数のことです。 クラス変数が役立つ場面は、インスタンス化されて生成された各オブジェクトに共通する変数が必要となった場合です。 --- 実際にコードを動かしてみたのでご確認宜しくお願い致します。https://paiza.io/projects/OqmsEDGmLaIl1zwHhCAOiA
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問