0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【解決】【Python】自作クラス内のlistに値を代入するときappendだと__dict__に代入されない

Last updated at Posted at 2021-08-12

8/12追記

@shiracamusさんより丁寧に解説して頂き解決しました。
結論として変数をインスタンス化をしていなかったらとなります。

class Result:

  def __init__(self):  # 初期化をしていなかった
    self.result = []

初期化することでappendでも代入されることを確認しました。
ありがとうございます。

以下追記前の記事です。

はじめに

PythonでクラスをJSONにシリアライズするときにハマったので書き落としておきます。
まだまだ初学者で根本的な間違いをしていそうなので、理由わかる方いましたらぜひ教えて頂きたいです。

環境

python 3.9.6
pipenv version 2021.5.29

本文

###0. 前準備
実行結果をまとめておくクラスに内包されたlistを用意しておきました。

  class Result:
    result: list[str] = []

###1. append
さて、ここに実行結果の文字列をどんどん代入していきますが最初はappendで追加していきました。

  def test_append(self):
    result = Result()
    result.result.append("a")
    result.result.append("b")
    result.result.append("c")
    json_string = json.dumps(result.__dict__, indent=4)
    print(json_string)
実行結果
{}

???となったので中身を見てみます。

  def test_append(self):
    result = Result()
    result.result.append("a")
    result.result.append("b")
    result.result.append("c")
    tmp = result.__dict__
    print(tmp)    # 結果: {}

空ですね。

###2. 演算子
次に演算子で代入してみました。

  def test_assignment(self):
    result = Result()
    result.result += ["a"]
    result.result += ["b"]
    result.result += ["c"]
    tmp = result.__dict__  # {'result': ['a', 'b', 'c']}
    jsonString = AnJson.objectToJson(result)
    print(jsonString)
実行結果
{
    "result": [
        "a",
        "b",
        "c"
    ]
}

入ってる。。。なぜ。。。

終わりに

Pythonの配列を使うと毎回挙動で躓くので勉強が足りてない感がすごいです。
今回のは放置しておくと今後困りそうなので記事に落としました。
ご親切な御仁がいましたらこの挙動の理由を教えて頂きたいです。

以上

参考

0
2
10

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?