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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

879閲覧

pythonで配列にクラスを入れた際の挙動について

sarasa_38765

総合スコア34

Python 3.x

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/06/29 10:19

#データベースからマスタの値を配列に読み込んでいるのですが、追加後配列の中身を参照すると最後のデータのみになってしまいます。件数と読み込みデータは正しいです。

python

1#idと名前のみのクラス 2class myClass(object): 3 def __init__(self, i_id,i_name): 4 self.id = i_id 5 self.name = i_name 6 7 8 9 10 11#配列を用意 12aaa = [] 13 14cow_breeds = Data.objects.raw('SELECT * FROM cow_breeds_data order by id asc') 15for p in cow_breeds: 16 #idと名前を格納 17 w_aaa = myClass 18 w_aaa.id = p.id 19 w_aaa.name = p.name 20 logging.debug(str(w_aaa.id) + "," + w_aaa.name) 21 #配列に追加 22 aaa.append(w_aaa) 23 241,'aaa' 252,'bbb' 263,'ccc' 27 28のデータを読み込んだ 29 30 31 32#配列の中身が最後のデータ 33for q in aaa: 34 logging.debug(str(q.id) + "," + q.name) 35 36 37しかし配列を見ると 38 393,'ccc' 403,'ccc' 413,'ccc' 42 43になってしまいます 44

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

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

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

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

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

guest

回答3

0

w_aaa = myClass この部分でクラス myClass 自体を参照しているのが原因です。
コード的には myClass のインスタンスを作ってリスト aaa に append する処理に見えます。

また、 w_aaa.id = p.id は有効ですが、 myClassのidとnameは
インスタンス生成時に渡す形で記述されているのでそれに沿った形で記述してみました。

python3

1from pprint import pp 2import logging 3logging.basicConfig(level=logging.DEBUG) 4 5#idと名前のみのクラス 6class myClass(object): 7 def __init__(self, i_id,i_name): 8 self.id = i_id 9 self.name = i_name 10 11# SQL実行結果の代わりのクラス 12class Breeds(): 13 def __init__(self, id, name): 14 self.id = id 15 self.name = name 16 17#配列を用意 18aaa = [] 19 20# cow_breeds = Data.objects.raw('SELECT * FROM cow_breeds_data order by id asc') 21cow_breeds = [] 22cow_breeds.append(Breeds(1, 'aaa')) 23cow_breeds.append(Breeds(2, 'bbb')) 24cow_breeds.append(Breeds(3, 'ccc')) 25 26for p in cow_breeds: 27 #idと名前を格納 28 w_aaa = myClass(p.id, p.name) 29 # w_aaa.id = p.id ↑で渡してあるので不要 30 # w_aaa.name = p.name 31 logging.debug(str(w_aaa.id) + "," + w_aaa.name) 32 #配列に追加 33 aaa.append(w_aaa) 34 35# 配列の中身をダンプ 36pp(aaa) 37 38#配列の中身が最後のデータ 39for q in aaa: 40 logging.debug(str(q.id) + "," + q.name)

投稿2020/06/29 10:49

YakumoSaki

総合スコア2027

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

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

sarasa_38765

2020/06/29 23:58

回答ありがとうございます。参考にします。
guest

0

次のように修正すると期待通りに動作します:

python

1for p in cow_breeds: 2 #idと名前を格納 3 # ↓ インスタンス生成していません、同じクラスを何度も直接使っています 4 # w_aaa = myClass 5 # w_aaa.id = p.id 6 # w_aaa.name = p.name 7 8  # ↓インスタンス生成します 9 w_aaa = myClass(p.id, p.name) 10 logging.debug(str(w_aaa.id) + "," + w_aaa.name) 11 #配列に追加 12 aaa.append(w_aaa)

動作結果:

python

1$ python test.py 21,aaa 32,bbb 43,ccc

原因

質問欄のコードは、クラスをインスタンス生成せずに使ってしまっています

python

1 w_aaa = myClass

インスタンスクラスは、よく「お菓子作り」の例で説明されます

インスタンスはクッキーで、クラスはクッキーを作るための金型です

お菓子作りにたとえると

金型????でクッキー????を大量生産して????につめようとしています

質問欄のコードは、金型????を直接????につめこんでいます
しかも、何度も同じ金型????を取り出しては、????につめこんでいます

????の中には金型????しか入っていません

そうではなく、
金型????からクッキー????をたくさん作って、????につめこむ必要がありますね

投稿2020/06/29 10:44

編集2020/06/29 10:52
y_shinoda

総合スコア3272

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

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

sarasa_38765

2020/06/29 23:59

分かりやすい説明ありがとうございます。よく理解できました。
guest

0

ベストアンサー

Python

w_aaa = myClass
w_aaa.id = p.id
w_aaa.name = p.name

これは次の誤りでしょうね。

Python

1w_aaa = myClass(p.id, p.name)

投稿2020/06/29 10:36

LouiS0616

総合スコア35668

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

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

sarasa_38765

2020/06/29 10:39

正解です。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問