

初歩の質問ですみません

[code]

    a = []
    a.append(1)
    
[/code]

これだと毎回a = []で初期化されて実行の度に[1]が出力されるだけだと思うのですが、  
実行の度に[1],[1,1],[1,1,1]...と追加で格納されていくようなコードの書き方を教えていただきたいです。


CC BY-SA 4.0
2021-10-11T17:15:43.203
83012
2021-10-16T19:39:43.383
2021-10-12T05:15:32.697
48600
48599
question
python
初期化されないlistの書き方


「実行の度に」が「ループ内実行の度に」か「関数実行の度に」または「python実行の度に」で回答が異なります。

### ループ内実行の度に追加

`a = []`の初期化をループの外に出します。

[code]

    a = []
    for i in range(3):
        a.append(i)
    
    print(a)   # [0, 1, 2]
    
[/code]

### 関数実行の度に追加

`a = []`の初期化を関数の外に出して関数の引数にします。  
(引数にしなくても動きますが、引数にした方が明確な形で記述できます)

[code]

    a = []
    def append_list(a, i):
        a.append(i)
    
    [append_list(a, i) for i in range(3)]
    print(a)   # [0, 1, 2]
    
[/code]

### python実行の度に追加

`python test.py`のように実行すると変数は必ず初期化されてしまいます。  
実行の度に変数の値を戻したい時は、必ずどこか(後述の直列化ファイルや設定ファイル、データベース、レジストリ
etc.etc...)に保存しておく必要があります。

pythonでは変数を手軽にバイナリオブジェクトファイルとして保存と復元する方法が用意されていて、この方法はプログラム言語によらず「直列化」と呼ばれることが多いです。  
直列化には[pickle](https://docs.python.org/ja/3.7/library/pickle.html)パッケージを使用します。

この仕組みを使って`python
test.py`実行時に`a`を直列化して`test.pickle`ファイルに保存し、実行する度にそのファイルから`a`リストのオブジェクトを復元することができます。

[code]

    import pickle
    
    try:
        a = pickle.load(open("test.pickle", "rb")) # 復元
    except:
        a = []   # test.pickleが存在しないなど、読込に失敗した場合は変数を初期化する
    
    value = max(a) + 1 if len(a) > 0 else 0
    a.append(value)
    print(a)
    
    pickle.dump(a, open("test.pickle", "wb")) # 保存
    
[/code]

**実行結果**

[code]

    > python test.py
    [0]
    > python test.py
    [0, 1]
    > python test.py
    [0, 1, 2]
    
[/code]

**参考資料**

[実行結果の変数を簡単に呼び出す方法](https://ja.stackoverflow.com/q/50186)  
[Pickle - Load variable if exists or create and save
it](https://stackoverflow.com/q/26835477)


CC BY-SA 4.0
2021-10-12T02:27:00.613
83024
2021-10-12T02:27:00.613
9820
83012
answer


わざわざ初期化されるのではなく、終了時にそれまでの状態が消えるのが一般的な動作です。

ですので、終了時に「次回起動時に利用できる形でデータを保存しておく」という処理が必要です。同時に、再実行時に「前回の処理で保存されていたデータを開いて使う」という処理も必要です。

初歩的なものならpickle、少し高度になるとsqlite3があります。これを `__init__`, `__del__`
を使って組み込み、自前のリストクラスを作れば目的が果たせます。

`__init__`, `__del__` の挙動を確認するサンプル

[code]

    #!/usr/bin/python
    
    class cls1(object):
        def __init__(self):
            print("__init__")
        def __del__(self):
            print("__del__")
    
    a = cls1()
    
[/code]


CC BY-SA 4.0
2021-10-12T04:46:02.133
83027
2021-10-16T19:39:43.383
2021-10-16T19:39:43.383
48452
48452
83012
answer