80818
関数の勉強を行っております。  
関数で保持される値のスコープについて質問があります。

下記2つの関数がありますが、1つ目の関数内の completed_designs.append(current_print) で  
空のリストに値を格納しておりますが、この格納した値は、ほかの関数（ここでは、def
show_completed_models(completed_modeles):）でも値は保持され続けているということで  
良いのでしょうか？

```

    def print_models(unprinted_designs, completed_designs):
        """
        リストから無くなるまで印刷する。
        印刷後、cpmpleted_designsに移動する。
        """
        while unprinted_designs:
            current_print = unprinted_designs.pop()
            print(f"印刷中->{current_print}")
            completed_designs.append(current_print) # 質問箇所
    
    def show_completed_models(completed_modeles):
        """
        印刷されたものを表示する。
        """
        
        for completed_model in completed_modeles:
            print(f"印刷完了->{completed_model}")
            
    
    unprinted_designs = ['aaa', 'bbb', 'ccc']
    completed_designs = []
    
    print_models(unprinted_designs, completed_designs)
    show_completed_models(completed_designs)
    
```
CC BY-SA 4.0
2021-08-15T06:56:14.513
80815
2021-08-15T07:44:38.420
question
python python3
python 関数の値の保持範囲（スコープ）について
下から2行目で`print_models(unprinted_designs, completed_designs)`と呼び出した際に、

  * `print_models`関数のローカル変数としての`unprinted_designs` = 呼び出し元の`unprinted_designs`、
  * `print_models`関数のローカル変数としての`completed_designs` = 呼び出し元の`completed_designs`、

と名前付けが行われます。よって、`print_models`関数内で`unprinted_designs`や`completed_designs`に対して変更操作を行うと、呼び出し元の`unprinted_designs`や`completed_designs`への操作が行われます。

`print_models`関数が終了すると、関数スコープでのローカル変数としての名前付けは解消されますが、呼び出し元での`unprinted_designs`や`completed_designs`に行った操作が取り消されるわけではありません。
CC BY-SA 4.0
2021-08-15T07:42:13.450
80817
2021-08-15T07:42:13.450
36010
80815
answer
はい。値は保持され続けています。  
変数completed_designsは下から4行目のところ、関数の外で定義されていますから、グローバルなスコープで変数が定義されていることになります。

その定義された変数を関数の引数で渡している(下から2行目,1行目)ので、  
関数print_modelsでも関数show_completed_modelsでも同じリストを参照していることになります。
CC BY-SA 4.0
2021-08-15T07:44:38.420
80818
2021-08-15T07:44:38.420
28626
80815
answer