[210522]TIL#2_파이썬 변수 Scope

Sean Kim·2021년 5월 22일

python

목록 보기
1/3
post-thumbnail

파이썬의 변수 선언/할당 로직에 대해 탐구해보았다.

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"

간단하다고 좋아할게 아니다, 파이썬이 내부적으로 어떻게 변수를 선언하는지를 확인해보자.

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 함수의 주석을 확인해보자

현재 스코프에 포함된 전역 변수들을 반환하는 기능이라고 한다.
이 dict를 업데이트 하면 전역 스코프에 영향을 준다고 하는데,
이것이 바로 파이썬이 메모리에 변수를 할당하는 방법이다.

--

"""
테스트 입니다.
"""

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/python@3.9/3.9.2_4/Frameworks/Python.framework/Versions/3.9/lib/python3.9/random.py'>, 
'a': 'Hello Python', 
'b': 1389571}

print문으로 globals()라는 객체를 출력해본 결과이다.

'__name__', '__doc__' 등과 같은 기본적인 변수외에도
import 한 random 모듈이나,
생성한 a / b 변수들에 대한 설명이 등장한다.

globals()['__name__'] = '__main2__'
print(globals()['__name__'])
##실행결과##
__main2__

핵심이 되는 '__name__' 변수의 값을 '__main__'이 아닌 다른 것으로 바꿀 수도 있다.

파이썬의 변수 관리 로직

  1. 파이썬은 내부적으로 특정 파일의 전역 스코프에서 사용되는 변수들을 dict 형태로 저장하고, 이를 메모리에 할당해둔다.
  2. 파일 내에 import된 module이나 파일의 정보, 주석문등도 (내부적으로는) 변수로 선언하고 메모리에 할당해둔다.
  3. 우리가 변수를 선언할 때마다, 파이썬은 해당 변수명을 Key로, 변수에 할당된 값을 Value로 globals()라는 dict에 저장하는 것이다.
  4. 변수의 값들이 파이썬 dict의 Value에 저장되기 때문에
    우리는 변수에 할당된 값들을 자유롭게 수정할 수 있으며(mutable),
    우리는 변수에 빈 값을 할당할 수도 있다(nullable).
    우리는 변수의 자료형을 지정해놓을 필요도 없다.

파이썬의 변수는 왜 mutable, nullable이며, 자료형을 사전에 설정할 필요가 없을까?

파이썬 내부 로직상 변수는 globals()라는 dict 안에 저장된다.
dictionary 라는 자료형의 특징은 다음과 같다.

1. 값을 추후에 수정할 수 있다.(mutable)
* 값을 수정할 수 없으며, key와 value 형태로 값을 저장하고자 한다면 namedtuple을 사용할 수 있다.
2. key만 존재하고 value는 아무 값도 갖지 않을 수 있다. (nullable)
3. 서로 다른 자료형을 담을 수 있는 '컨테이너'이다. 
* 같은 자료형만 담을 수 있는 구조를 '플랫'이라고 한다. str, array등이 포함된다.

그러니까!
파이썬이 내부적으로 변수를 dict에 저장하기 때문에,
우리는 파이썬을 통해 mutable하고, nullable하며, 자료형에 구애받지 않는 변수 선언을 할 수 있는 것이다.


장난치기

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

변수 선언 없이 변수를 동적으로 생성하는 장난도 쳐볼 수 있다!

profile
이것저것 해보고있습니다.

0개의 댓글