파이썬의 변수 선언/할당 로직에 대해 탐구해보았다.
많은 프로그래밍 언어를 배워보진 않았지만, 변수를 선언하는데에 있어 파이썬만큼 간단한 언어는 없을 것이다.
// 코틀린의 변수 선언
// 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라는 빌트인 함수를 통해 파일 내 모든 전역 변수를 확인해볼 수 있다.
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__'이 아닌 다른 것으로 바꿀 수도 있다.
파이썬 내부 로직상 변수는 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
변수 선언 없이 변수를 동적으로 생성하는 장난도 쳐볼 수 있다!