[21522]TIL 2 Python変数Scope


Pythonの変数宣言/割当てロジックを検討した.
pythonの変数を宣言する方法
多くのプログラミング言語を学んだことはありませんが、変数を宣言する上でPythonほど簡単な言語はありません.
// 코틀린의 변수 선언
// 1. 변수 선언 예약어 var(혹은 val) 사용
// 2. 변수 명 설정
// 3. 변수 자료형 설정
// 4. npe 설정
// 5. 변수에 값 할당
var a: String? = "Hello Kotlin"
/*
php의 변수 선언
1. php 코드 영역 설정 (<?php?>
2. 변수 선언 ($)
3. 값 할당
*/
<?php
$a="Hello php";
?>
# python의 변수 선언
# 1. 변수 선언 및 값 할당
a = "Hello Python"
簡単に好きになるわけではありませんが、Pythonが内部で変数をどのように宣言しているかを見てみましょう.
globalsという名前の関数で、ファイル内のすべてのグローバル変数をチェックできます.
Python変数探究のコア「globals」
print(type(globals))
##실행결과##
<class 'builtin_function_or_method'>
globalsはpythonの構築関数です.
--
print(globals.__doc__)
##실행결과##
Return the dictionary containing the current scope's global variables.

NOTE: Updates to this dictionary *will* affect name lookups in the current
global scope and vice-versa.
globals関数のコメントを確認する
これは、現在のscopeに含まれるグローバル変数を返す機能です.
このdictを更新すると、グローバルスキャンに影響します.
これがPythonがメモリに変数を割り当てる方法です.
--
"""
테스트 입니다.
"""

import random

a = "Hello Python"
b = 1389571

print(globals())
##실행결과##
{
'__name__': '__main__', 
'__doc__': '\n테스트 입니다.\n', 
'__package__': None, 
'__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10140ae20>, 
'__spec__': None, 
'__annotations__': {}, 
'__builtins__': <module 'builtins' (built-in)>, 
'__file__': '/Users/seankim/Library/Mobile Documents/com~apple~CloudDocs/python/test.py', 
'__cached__': None
'random': <module 'random' from '/opt/homebrew/Cellar/[email protected]/3.9.2_4/Frameworks/Python.framework/Versions/3.9/lib/python3.9/random.py'>, 
'a': 'Hello Python', 
'b': 1389571}
これはprint文でglobals()オブジェクトを出力した結果です.
「name」、「doc」などの基本変数.
インポートされたランダムモジュール.
生成されたa/b変数について説明します.
globals()['__name__'] = '__main2__'
print(globals()['__name__'])
##실행결과##
__main2__
コア「name」変数の値を「main」に変更することもできます.
Pythonでの変数管理ロジック
  • Pythonの内部には、特定のファイルのグローバルスキャンで使用される変数がdict形式で格納され、メモリに割り当てられます.
  • ファイルにインポートされたモジュールやファイルの情報、コメントなど(内部)も変数として宣言され、メモリに割り当てられます.
  • すなわち、Pythonは、変数を宣言するたびに、その変数名をKeyとして保存し、その変数に割り当てられた値をglobals()というdictに格納する.
  • 変数の値はPython dictのValueに格納されます.
    変数に割り当てられた値(可変)を自由に変更できます.
    変数に空の値(nullable)を割り当てることもできます.
    変数の資料型を指定する必要はありません.
  • なぜPythonの変数は可変でnullableで、データ型を事前に設定する必要がないのですか?
    Python内部論理変数はglobals()というdictに格納される.
    ディクショナリという資料型の特徴は:
    1. 값을 추후에 수정할 수 있다.(mutable)
    * 값을 수정할 수 없으며, key와 value 형태로 값을 저장하고자 한다면 namedtuple을 사용할 수 있다.
    2. key만 존재하고 value는 아무 값도 갖지 않을 수 있다. (nullable)
    3. 서로 다른 자료형을 담을 수 있는 '컨테이너'이다. 
    * 같은 자료형만 담을 수 있는 구조를 '플랫'이라고 한다. str, array등이 포함된다.
    そうですね.
    Pythonは変数をdictに格納するので、
    Pythonでは、データ型に制限されない可変、空の変数宣言を行うことができます.
    いたずらをする
    globals()というdictに触れると、変数を動的に宣言できます.
    # 구구단을 변수로 만들어보자
    for fore in range(1,10):
        for back in range(1,10):
            globals()['gugudan_{}{}'.format(fore, back)] = fore * back
    
    print(gugudan_43)
    print(gugudan_88)
    ##실행결과##
    12
    64
    変数宣言なしで動的に変数を生成するゲームもできます!