[Pythonベース]変数の範囲(領域変数/グローバル変数)


1.ゾーン変数
1-1. 特長
  • 関数で使用される変数.
  • 領域変数は呼び出し関数内でのみ有効です.
  • を呼び出す関数の実行が終了すると、その変数も削除され、使用できなくなります.
    ->呼び出し後に変数を使用する場合は、returnを使用します.
  • 関数のパラメータも領域変数です.
  • 1-2. 使用例
    def func():
        x = 10
        print(x)
        
    func()
    print(x)
    👉 실행 결과
    10
    -------------------------------------------------------------------
    NameError                   Traceback (most recent call last)
    <ipython-input-1-77d987d7788b> in <module>
    
    
    ----> 7 print(x)
    
    NameError: name 'x' is not defined
    ✍ 문제 풀이
    * x는 fucn() 함수 내에서 사용되고 있으므로 지역번수이다.
    * 함수의 호출에서 return이 따로 주어지지 않았기 때문에 지역변수 x는 함수가 종료됨과 동시에 삭제된다.
    * 따라서 x는 func()에서만 유효하므로 print(x)하면 x값이 정의되지 않았으므로 오류가 발생한다.
      (실행결과 첫 번째 값은 func() 정의 부분에서 print한 부분이 출력된 것이다.)
    ✔ Check!
  • 関数で使用される領域変数は、関数でのみ使用できます.
  • 関数の外部で変数を使用しようとすると、変数が定義されていないことを示すエラーメッセージが表示されます.
  • の上記の例のfunc()関数で使用される変数xは、領域変数と呼ばれる.
    ゾーン変数は、func()関数が呼び出されたときにのみ使用できます.
    この点を覚えておいてください.
  • 2.グローバル変数
    2-1. 特長
  • プログラムのメインルーチンで使用される変数.
  • 領域変数とは異なり、グローバル変数はサブ関数で有効です.
  • 2-2. 使用例
    例1.グローバル変数の使用
    def func():
        print(x)
        print(id(x))
    
    x = 10
    print(x)
    print(id(x))
    func()
    👉 실행 결과
    10
    140719703827120
    10
    140719703827120
    ✍ 문제 풀이
    * 1~3행에서 함수를 정의한다.
    * 5행에서 변수 x에 10을 저장한다. (이처럼 프로그램의 메인 루틴에 정의된 변수 x는 전역 변수가 된다.)
    * 전역 변수는 하위 함수를 포함한 모든 범위에서 사용 가능하다.
    * 따라서 2~3행의 출력문에서 사용된 x는 5행에서 정의된 전역 변수이다.
    例2.サブ関数のグローバル変数値の変更
    def func():
        x = 100
        print(x)
        print(id(x))
    
    x = 10
    print(x)
    print(id(x))
    
    func()
    
    print(x)
    print(id(x))
    👉 실행 결과
    10
    140719703827120
    100
    140719703830000
    10
    140719703827120
    ✍ 문제 풀이
    * 1~4행에서 함수를 정의한다.
    * 6행에서 변수 x에 10을 저장한다. (변수 x는 메인에 있으므로 전역변수이다.)
    * 10행에서 func() 함수가 호출되는데, 이 때 func()함수 안에 있는 출력문이 실행된다.
    * func()함수 안에서는 변수가 100으로 바뀌었으므로 바뀐 x값과 id값을 출력한다.
    * x=100은 fucn()함수 안에서만 사용가능하므로, 12~13행은 전역 변수로 선언된 x의 값과 id가 출력된다.
    * 2행과 6행의 변수 x는 같은 변수명을 사용하고 있지만, 다른 메모리 공간을 사용하고 있음을 알 수 있다.
    -> 이는 두 변수가 전혀 다른 변수라는 것을 의미한다. (x=100의 x는 지역변수, x=10의 x는 전역변수)

  • 10行目のfunc()関数では、変数xの値を100に変更します.
    12〜13行目から分かるように、6行目の変数xと同じ値とメモリアドレスを有する.

  • つまり、6行変数xと2行変数xは全く異なる変数である.
  • 🧐 では、関数で使用する変数xをグローバル変数として使用したい場合は、どうすればいいのでしょうか.(2行目で使用したx)
    次の例を使用して、問題を解決します.
    例3.キーワードglobalの使用例
    def func():
        global x
        x = 100
        print(x)
        print(id(x))
    
    x = 10
    print(x)
    func()
    print(x)
    print(id(x))
    👉 실행 결과
    10
    100
    140719703830000
    100
    140719703830000
    ✍ 문제 풀이
    * 2행에서와 같이 키워드 'global'을 사용하여 변수 x를 정의하면,
      이 변수는 지역 변수가 아니라 프로그램 전체에서 사용 가능한 전역 변수가 되는 것이다.
      
    * 실행 결과를 보면, 호출된 함수 func()의 3행에서 전역 변수 x를 100으로 변경한 것이
      함수 호출 후인 10~11행에서도 적용되었음을 알 수 있다.
    ✔ Check!
  • グローバル変数は、関数の内部ではなくメインインスタンスで定義する必要があります.
  • 変数はメモリ領域の名前のみであり、領域変数とグローバル変数の名前は同じである可能性があります.
    (ただし、この2つの変数は全く異なる変数です.)
  • 領域変数で使用される関数を関数外部に書き込み続ける場合は、グローバル関数を使用するかreturnを使用します.
  • globalよりreturnの方が良いです.
  • 💥 returnの内容については関数のパラメータの呼び出しと戻しの投稿を参照してください.