๐ ํด๋น ํฌ์คํ ์ ๊ณ ์ฑ๋ฅ ํ์ด์ฌ 2ํ ์ฑ ์์ ์ ์ฝ๊ณ ๊ฐ์ธ์ ์ธ ํ์ต ๋ชฉ์ ํ์ ์์ฑ๋ ๊ธ์ ๋๋ค. ํฌ์คํ ์์ ์ฌ์ฉ๋๋ ์๋ฃ๋ค์ ์ฑ ์ ๋ด์ฉ์ ์ฐธ๊ณ ํ๋ ๋ณธ์ธ์ด ์ง์ ์ฌ๊ตฌ์ฑํ ์๋ฃ์์ ์๋ฆฝ๋๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ ํ์ด์ฌ์ ์๋ฃ๊ตฌ์กฐ ์ค ์ ๋ ฌ๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ ๋ฌธ์ ์ ์ ํฉํ dictionary(์ดํ ์ฌ์ )๊ณผ set(์ดํ ์ )์ ๋ํ ๋ด์ฉ์ ๊ณต๋ถํด๋ณด๋ฉด์ ์์๋๋ฉด ์ข์ ๋ด์ฉ๋ค์ ๋ํด ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค.
1. ์กฐํ๋ ํ ๋ฒ์, ์ฝ์ ๋ ํ ๋ฒ์!
์ ๊ณผ ์ฌ์ ์ ํน์ ๋ฐ์ดํฐ๋ฅผ ๊ณ ์ ํ๊ฒ ์ฐธ์กฐํ ์ ์๋ ๋ณ๋ ๊ฐ์ฒด๊ฐ ์๋ ์ํฉ์์ ๊ฐ์ฅ ์ด์์ ์ธ ์๋ฃ๊ตฌ์กฐ์ด๋ค. ์ฌ๊ธฐ์ '๊ณ ์ ํ๊ฒ ์ฐธ์กฐํ ์ ์๋ ๋ณ๋ ๊ฐ์ฒด'๋, 'key : value' ๋ก ์ด๋ฃจ์ด์ง ์๋ฃ๊ตฌ์กฐ ์ค 'key'์ ํด๋นํ๋ ๊ฐ์ด๋ค. ์ด key ๋ผ๋ ์ฐธ์กฐํ๋ ๊ฐ์ฒด๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฌธ์์ด์ด์ง๋ง ํด์๊ฐ ๊ฐ๋ฅํ ์ฆ, hashable ํ ์ด๋ค ํ์ ์ด๋ผ๋ ์๊ด์๋ค.
ํ์ด์ฌ์์ ํน์ ํ์ ์ ๋ฐ์ดํฐ๊ฐ hashable ์ฌ๋ถ๋ฅผ ํ๋จํ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค.
import typing
def is_hashable(*args):
for a in args:
print(a, type(a), '-> hashable:', isinstance(a, typing.Hashable))
int_data = 1000
float_data = 1000.1
string_data = '1000.1'
list_data = [1, 2, 3]
tuple_data = (1, 2, 3)
is_hashable(int_data, float_data, string_data, list_data, tuple_data)
์ ์ฝ๋๋ฅผ ์คํํ๊ฒ ๋๋ฉด ์๊ฒ ์ง๋ง ์ ์ฝ๋์์ ์ ์ํ ์ ์, ์ค์, ๋ฌธ์์ด, ํํ์ ๋ชจ๋ hashableํ ์๋ฃ๊ตฌ์กฐ์ด์ง๋ง ๋ฐ์ดํฐ ์์ ์ ์ฌ์ง๊ฐ ์๋ ๋ฆฌ์คํธ๋ง hashableํ ์๋ฃ๊ตฌ์กฐ๊ฐ ์๋๋ค.
์ฌ์ ๊ณผ ์ ์ ์ฐจ์ด์ ์ด๋ผ๊ณ ํ๋ค๋ฉด ๋ฐ์ดํฐ์ ํด๋นํ๋ ๊ฐ(value)๊ฐ ์๋ค๋ ์ ์ด๋ค. ์ฌ์ ์ ์๊ณ , ์ ์ ์๋ค. ๋ํ ์ ์ ์ ์ผํ key๋ฅผ ์ ์ฅํ๋ ์๋ฃ๊ตฌ์กฐ์ด๋ค. ๊ทธ๋์ ์งํฉ ์ฐ์ฐ์ ์ํํ ๋ ์ฃผ๋ก ์ฌ์ฉ๋๋ค. ๋ฌผ๋ก ์ฌ์ ๋ ๊ธฐ์กด์ ๊ฐ๊ณ ์๋ key์ ๋์ผํ key๋ฅผ ๊ฐ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ ์๋ฃ๊ตฌ์กฐ์ ๋ฃ์ผ๋ฉด ์ดํ์ ๋ฃ์ ๋ฐ์ดํฐ๊ฐ ๋ฎ์ด์ฐ๊ธฐ ๋๋ค.
์ด์ ํฌ์คํ ์์ ์ ๋ ฌ๋์ง ์์ ๋ฆฌ์คํธ์ ํํ์ ํน์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๋ ์๋ฌด๋ฆฌ ๋นจ๋ผ๋ $O(logn)$ ์๊ฐ ๋ณต์ก๋๊ฐ ๊ฑธ๋ฆฐ๋ค๊ณ ๋ฐฐ์ ๋ค. ํ์ง๋ง ์ฌ์ ๊ณผ ์ ์ ํน์ ๋ฐ์ดํฐ(์๋ฐํ ๋งํ๋ฉด ๋ฐ์ดํฐ์ index)๋ฅผ ์กฐํํ ๋ $O(1)$ ์๊ฐ ๋ณต์ก๋ ๋ฐ์ ๊ฑธ๋ฆฌ์ง ์๋๋ค. ๋ํ ๋ฐ์ดํฐ ์ฝ์ ์ ๊ฒฝ์ฐ ์ฌ์ ๊ณผ ์ ์ ๋ฆฌ์คํธ, ํํ ๋์ ๋ง์ฐฌ๊ฐ์ง๋ก $O(1)$ ์๊ฐ ๋ณต์ก๋๊ฐ ๊ฑธ๋ฆฐ๋ค.
์ด๋ ๊ฒ๋ง ๋ณด๋ฉด ์ฌ์ ๊ณผ ์ ์ด ์ฅ์ ๋ง ์์ ๊ฒ ๊ฐ์ง๋ง, ์ฌ์ ๊ณผ ์ ์ ์๋์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐฉ๊ธ ์ฌ์ ๊ณผ ์ ์ด ๋ฐ์ดํฐ๋ฅผ ์กฐํ/์ฝ์ ํ ๊ฒฝ์ฐ ๋ชจ๋ ์๊ฐ๋ณต์ก๋ $O(1)$์ด ๊ฑธ๋ฆฐ๋ค๊ณ ํ์ง๋ง, ์๋ฐํ ๋งํด์ ์ด ์๋๋ ์ฌ์ ๊ณผ ์ ์ด ์ฌ์ฉํ๋ ํด์ ํจ์์ ์ ์ ์ผ๋ก ์์กดํ๊ฒ ๋๋ค. ๋ง์ฝ ๋๋ฆฐ ํด์ ํจ์๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ ๊ณผ ์ ์ด๋ผ๋ฉด ๋ฐ์ดํฐ๋ฅผ ์กฐํ/์ฝ์ ํ ๋ ์๊ฐ ๋ณต์ก๋ $O(1)$์ ๋ณด์ฅํ์ง ๋ชปํ๋ค.
์ด์ ์ด ํด์ ํจ์๊ฐ ์ฌ์ ๊ณผ ์ ์ด๋ ๋ฌด์จ ์๊ด์ด ์๋์ง ์์๋ณด๋๋ก ํ์.
2. ์ฌ์ ๊ณผ ์ ์ ๋์ ์๋ฆฌ: ํด์ํจ์
์ฌ์ ๊ณผ ์ ์ ํด์ ํ ์ด๋ธ์ด๋ผ๋ ๊ฒ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๋ฅผ ์กฐํ, ์ฝ์ ํ๋ ์๊ฐ ๋ณต์ก๋๊ฐ ๋ชจ๋ $O(1)$์ด๋ค. ์ด ํด์ ํ ์ด๋ธ์ด๋ ๋ฌด์์ผ๊น? ํด์ ํ ์ด๋ธ์ ์ดํดํ๊ธฐ์ ์์ ํด์ ํจ์๋ผ๋ ๊ฒ๋ถํฐ ์์์ผ ํ๋ค. ์ต๊ทผ์ ๋จ๊ฑฐ์ด ๊ฐ์์๋ ๋นํธ์ฝ์ธ, ๋ธ๋ก์ฒด์ธ ๋ถ์ผ์ ๋ํด ์กฐ๊ธ์ด๋ผ๋ ๊ด์ฌ์๋ ์ฌ๋๋ค์ ํด์ ํจ์์ ๋ํด ๋ค์ด๋ณธ ์ ์ด ์์ ๊ฒ์ด๋ค. ํด์ ํจ์๋ ๊ฐ๋จํ๋ค. ์ ๋ ฅ์ ๋ฃ์ผ๋ก ์ถ๋ ฅ์ ๋ด๋ฑ๋ ๊ฐ๋จํ ํจ์์ด๋ค.
๊ทธ๋ฌ๋ฉด ์ฌ์ ๊ณผ ์ ์์์ ํด์ฌ ํจ์๋ ์ด๋ค ๊ฒ์ ์ ,์ถ๋ ฅ์ผ๋ก ๋ฐ๋ ๊ฑธ๊น? ์ ๋ ฅ์ ์์์ key์ด๊ณ , ์ถ๋ ฅ์ ๋ฆฌ์คํธ์ index(์์ธ)์ ์ถ๋ ฅํ๋ค.
ํด์ ํ ์ด๋ธ์ ์ด๋ฌํ ํด์ ํจ์๋ฅผ ํจ์จ์ ์ผ๋ก ํ์ฉํ ๊ฒ์ด๋ค. ์ฆ, ๋ฐ์ดํฐ์ key๋ฅผ list์ ์์ธ ์ฒ๋ผ ์ฌ์ฉํ๋๋ก ๋ณํํ๋ ์์ ์ ํด์ ํจ์๊ฐ ์ํํด์ฃผ๋ฉด ํด์ ํ ์ด๋ธ์ list์ ๊ฐ์ ์ฑ๋ฅ์ ๋ธ๋ค. ๊ทธ๋ฆฌ๊ณ ํด์ํจ์์ ๋ฆฌ์คํธ(list)๋ ๋์ค์ ๊ฒ์์ ํ์ง ์๊ณ ๋ ํน์ ๋ฐ์ดํฐ๊ฐ ์ ๋๋ก ๋ค์ด์๋์ง ํ์ธํ๋ ์ฉ๋๋ก ์ฌ์ฉํ๋ค.
๋ฐฉ๊ธ ์์๋ณธ ๊ฒ์ฒ๋ผ ํด์ ํ ์ด๋ธ์ ์ ์ ์ผ๋ก ํด์ ํจ์์ ์ฑ๋ฅ์ ์์กดํ๋ค. ๋ฐ๋ผ์ ํด์ ํจ์๋ฅผ ์ ์ํ๋ ๋ถ๋ถ์ ์๋ฃ๊ตฌ์กฐ์ ์ฑ๋ฅ์ ์ข์ฐํ ๋งํผ ์ค์ํ๋ค. ๋ฌผ๋ก ํ์ด์ฌ์์๋ ๋๋ถ๋ถ์ ํ์ ์ ๋ํด์ ํด์ ํจ์๋ฅผ ์ ๊ณตํ๋ฏ๋ก ์์ธ ์ํฉ์ด ์๋๋ผ๋ฉด ์ง์ ํด์ ํจ์๋ฅผ ์์ฑํ ์ผ์ ๊ฑฐ์ ์๋ค. ๊ทธ๋์ ํด๋น ํฌ์คํ ์์๋ ํด์ ํจ์๋ฅผ ํ์ฉํ๋ ์ฌ์ ๊ณผ ์ ์ ๊ตฌ์ฒด์ ์ธ ๋์ ์๋ฆฌ์ ๋ํด์๋ ์คํตํ๊ณ ๋์ด๊ฐ๋ค. ์ด์ ๋ํด ๊ถ๊ธํ ๋ถ๋ค์ ์๋ณธ ์ฑ ์ ์ฐธ์กฐํ๋๋ก ํ์.
์ด๋ฒ ํฌ์คํ ์์๋ ์ฌ์ฉ์ ์ ์ ํด๋์ค๋ฅผ ํ์ฉํ ๋, ํด์ ํจ์๋ฅผ ์ปค์คํ ํ๊ฒ ์กฐ์ํ๋ ์ฌ๋ก์ ๋ํด ์์๋ณด์. ๋จผ์ ์ด ์ฌ๋ก๊ฐ ํ์ํ ๊ฒฝ์ฐ์ ๋ํด ์์๋ฅผ ๋ค์ด๋ณด์. ๋ง์ฝ ์๋์ ๊ฐ์ ์ฌ์ฉ์ ์ ์ ํด๋์ค๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
class Point(object):
def __init__(self, x, y):
self.x, self.y = x, y
์ ํด๋์ค์ ๋ํด์ 2๊ฐ์ ๊ฐ์ฒด๋ฅผ ์๋์ฒ๋ผ ์์ฑํด๋ณด์.
p1 = Point(1, 1)
p2 = Point(1, 1)
๊ทธ๋ฐ๋ฐ ์์ฒ๋ผ ์์ฑํ ๋ณ์ p1 ๊ณผ p2๋ ๋์ผํ ๊ฐ์ฒด์ผ๊น? ์ฌ๊ธฐ์ ๋์ผํ๋ค๊ณ ํ๋ ๊ฒ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊น์ง ๋์ผํ ๊ฐ์ฒด์ธ์ง๋ฅผ ์๋ฏธํ๋ค. ๋์ผํ ๊ฐ์ฒด์ธ์ง ํ์ธํ๊ธฐ ์ํด ์ ๋ณ์๋ค์ ์ ์๋ฃ๊ตฌ์กฐ์ ๋ฃ์ด๋ณด๋ฉด ์๊ฒ๋ ๊ฒ์ด๋ค.
p1 = Point(1, 1)
p2 = Point(1, 1)
temp = set([p1, p2])
print(temp) # {<__main__.Point object at 0x105d5e560>, <__main__.Point object at 0x10636eb60>}
์ถ๋ ฅ์ ๋ณด๋ฉด p1์ '0x105d5e560' ๋ผ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ p2๋ '0x10636eb60' ๋ผ๋ ์๋ก ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ฐ๊ณ ์๊ณ , ์ด์ ๋ฐ๋ผ ์ ์๋ฃ๊ตฌ์กฐ์ ๋ด๋๋ผ๋ 2๊ฐ๊ฐ ๋ค์ด์์์ ๋ณผ ์ ์๋ค. ๋ง์ฝ์ ์ด 2๊ฐ์ ๊ฐ์ฒด๊ฐ ์๋ก ๋์ผํ๋ค๊ณ ๊ฐ์ฃผํ๋๋ก ํด์ฃผ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น?
์ด๋ฅผ ๊ตฌํํ๊ธฐ ์ํด์ ์ฐ๋ฆฌ๋ ๋ ๊ฐ์ ๊ฐ์ฒด๊ฐ ์๋ก ๋์ผํ๋ค๋ผ๋ ๊ฒ์ ๊ฒ์ฆํ๋ ์กฐ๊ฑด์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ ์๋ ์ค์ ๋ด์ฉ(๋ฐ์ดํฐ)์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์ฌ์ฉ์ ์ ์ ํจ์๋ฅผ ์์ฑํ๋ฉด ๋๋ค. ์ฌ๊ธฐ์ ์์ฑํ๋ค๋ ์ฌ์ฉ์ ์ ์ ํจ์๋ ๋ค์๊ณผ ๊ฐ๋ค. ์ฌ์ฉ์ ์ ์ ํด๋์ค์๋ ๊ธฐ๋ณธ ํด์ ํจ์์ ๋น๊ต ํจ์๊ฐ ์กด์ฌํ๋๋ฐ, ๊ธฐ๋ณธ ํด์ ํจ์์ธ __hash__ ๋ผ๋ ๋งค์ง ๋ฉ์๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋ฐํํ๋ ๋ด์ฅ ๋ฉ์๋์ธ id()๋ฅผ ์ด์ฉํด์ ํน์ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋ฐํํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋น๊ต ํจ์์ธ __eq__ ๋งค์ง ๋ฉ์๋๋ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ์์น ์ฌ๋ฌ ๊ฐ๋ฅผ ์๋ก ์ฐ์ ๋น๊ตํ๋ค.(์ฐธ๊ณ ๋ก Python2.x ๋ฒ์ ๋์์๋ __cmp__ ๋งค์ง ๋ฉ์๋๊ฐ ์ฌ์ฉ๋์์ง๋ง Python3.x ๋ฒ์ ๋๋ก ์ค๋ฉด์ deprecated ๋์๋ค)
๋ฐ๋ผ์ __hash__, __eq__ ๋งค์ง ๋ฉ์๋ ์ด 2๊ฐ๋ฅผ ์๋์ฒ๋ผ ์ค๋ฒ๋ผ์ด๋ฉ ํด๋ณด์.
class Point(object):
def __init__(self, x, y):
self.x, self.y = x, y
def __hash__(self):
return hash((self.x, self.y))
def __eq__(self, other: Point):
return self.x == other.x and self.y == other.y
๋จผ์ ํด์ ํจ์์์ return ํ๋ ๊ฐ์ ๊ฐ์ฒด์ ๋ฐ์ดํฐ x, y๋ฅผ ํ๋๋ก ๋ฌถ์ด ํด์ ํจ์์ ๋ฃ์ด์ฃผ๋๋ก ํ์. ์ด๋ Point ๋ผ๋ ๊ฐ์ฒด๋ฅผ hashableํ ๊ฐ์ฒด๋ก ๋ง๋ค์ด ์ฃผ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ๋ค ๋ ๊ฐ์ ๊ฐ์ฒด๊ฐ ๋์ผํ์ง ์ฌ๋ถ๋ฅผ ๊ฒ์ฆํ๋ ๋น๊ต ์ฐ์ฐ์์ธ __eq__ ๋งค์ง ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ์ค๋ค. ํด๋น ๋ฉ์๋๊ฐ ๊ตฌํ๋ ๋ก์ง์ ๋ณด๋ฉด ๊ฐ์ฒด์ ์์ฑ ๊ฐ์ธ x, y๊ฐ ๋ชจ๋ ๋์ผํ๋ฉด ๋์ผํ๋ค๊ณ ๊ฐ์ฃผํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด๋ ๊ฒ ๊ตฌํ๋ Point ๊ฐ์ฒด๋ฅผ ์๋กญ๊ฒ 2๊ฐ ์์ฑํ๊ณ , ์ ์๋ฃ ๊ตฌ์กฐ์ ๋ด์๋ณด์.
p1 = Point(1, 1)
p2 = Point(1, 1)
temp = set([p1, p2])
print(temp) # {<__main__.Point object at 0x10636f250>}
๊ทธ๋ฌ๋ฉด ์ด์ 2๊ฐ์ ๊ฐ์ฒด๊ฐ ๋์ผํ๋ค๋ ๊ฒ์ด ๊ฐ์ฃผ๋์ด ์ ์๋ฃ๊ตฌ์กฐ์๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ '0x10636f250'์ธ ๊ฐ์ฒด ํ๋ ๋ฐ์ ์กด์ฌํ์ง ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด๋ ๊ฒ ํด์ ํจ์๋ฅผ ์๋กญ๊ฒ ์ ์ํ๋ ๊ฒ์ ์๋กญ๊ฒ ์ ์ํ ํด์ ํจ์์ ์ํธ๋กํผ๋ฅผ ๊ณ ๋ คํด์ผ ํ๋ค. ์ฌ๊ธฐ์ ์ํธ๋กํผ๋, ํด์ ํจ์๊ฐ ์ผ๋ง๋ ๊ท ์ผํ ๋ถํฌ๋ก ํด์๊ฐ์ ๋ง๋ค์ด๋ด๋์ง๋ฅผ ์๋ฏธํ๋ค. ์ฌ๊ธฐ์๋ ํด์ ํจ์๊ฐ ์ผ๋ง๋ ๊ท ์ผํ ๋ถํฌ๋ก list์ index๋ฅผ ์์ฑํ๋์ง๋ฅผ ์๋ฏธํ๋ค. ์ด ์ํธ๋กํผ๊ฐ ์ต๋์ธ ๊ฒ์ ํด์๊ฐ์ด ๊ท ์ผํ ๋ถํฌ์ด๋ฉฐ ์ด๋ ๊ณง ํด์ ํจ์๊ฐ ์ต์ ์ถฉ๋์ ๋ณด์ฅํ๋ ๊ฒ์ด๋ฉฐ ์์ ํด์ํจ์๋ฅผ ์๋ฏธํ๋ค. ์ด๋ฌํ ํด์ ํจ์๋ก ๊ตฌํ๋ ์ฌ์ ๊ณผ ์ ์๋ฃ๊ตฌ์กฐ๋ ๋งค์ฐ ์ข์ ์ฑ๋ฅ์ ๋ณด์ธ๋ค.
3. ์ฌ์ (dictionary) ํ์์ด ์ด๋ฃจ์ด์ง๋ ๊ณณ: ๋ค์์คํ์ด์ค
์ง๊ธ๊น์ง ๋ฐฐ์ด ๊ฒ์ฒ๋ผ ์ฌ์ ์ ๋ฐ์ดํฐ๋ฅผ ์กฐํ(ํ์)ํ ๋ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด ๋งค์ฐ ๋น ๋ฅธ ๊ฒ์ ์ ์ ์์๋ค. ํ์ง๋ง ์๋ฌด๋ฆฌ ๋น ๋ฅด๋ค๊ณ ํด๋ ๋ถํ์ํ ํ์์ ์ฝ๋ ์คํ ์๋๋ฅผ ๋จ์ด๋จ๋ฆฌ๋ ์์ธ์ด ๋๋ค. ์ด๋ฌํ ๊ณผ๋ํ ์ฌ์ ํ์์ผ๋ก ์ธํด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ ๋ถ๋ถ์ด ๋ฐ๋ก ํ์ด์ฌ์ ๋ค์ ์คํ์ด์ค ๊ด๋ฆฌ์ด๋ค.
๋จผ์ ํ์ด์ฌ์ ๋ค์์คํ์ด์ค์ ๋ํด์ ์์์ผ ํ๋ค. ํ์ด์ฌ์์๋ ๋ณ์, ํจ์, ๋ชจ๋์ด ์ฌ์ฉ๋ ๋ ๊ทธ ๊ฐ์ฒด๋ฅผ ์ด๋์ ์ฐพ์ ๋ถ๋ฌ์ฌ์ง ๊ฒฐ์ ํ๋ ๊ณ์ธต์ด ์๋ค. ์ด๋ฅผ ๋ฐ๋ก ๋ค์์คํ์ด์ค๋ผ๊ณ ํ๋ค. ํ์ด์ฌ์ ํฌ๊ฒ ์๋์ ๊ฐ์ ์์๋ก ๊ฐ์ฒด๋ฅผ ์ฐพ๊ฒ ๋๋ค.
ํ์ด์ฌ์ ๊ฐ์ฅ ๋จผ์ ๋ชจ๋ ์ง์ญ ๋ณ์๋ฅผ ๋ด์ ์ง์ญ ๋ค์์คํ์ด์ค์ locals() ๋ผ๋ ๋ฐฐ์ด์์ ์ฐพ๊ธฐ ์์ํ๋ค. ์ด ๋จ๊ณ์์๋ ์ ์ผํ๊ฒ ์ฌ์ ํ์์ ์ํํ์ง ์๋ ๋ถ๋ถ์ด๋ค. ์ด locals() ๋ฐฐ์ด์ ํจ์๋ฅผ ํธ์ถ ํ ๋ ๋ง๋ค์ด์ง๋ ์คํ ํ๋ ์์ด๋ผ๋ ์๋ฃ๊ตฌ์กฐ ์์ ์ง์ญ ๋ณ์ ์์ญ์ ์๋ฏธํ๋ค. ํจ์๋ ์์ ์ ์ง์ญ ๋ณ์์ ์ ๊ทผํ ๋๋ ์คํ ํ๋ ์ ๋ด์ ์ง์ญ ๋ณ์ ์์ญ์ ์ด๋ค ๋ฐ์ดํฐ๊ฐ ๋ช ๋ฒ์งธ์ ์๋์ง index ๊ฐ์ ๋ฏธ๋ฆฌ ์๊ณ ์๋ ์ํ์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ ํ์์ ํ์ง ์๊ณ ๋ ๊ณง๋ฐ๋ก ์ ๊ทผํ ์ ์๋ค.
๋ค์์ผ๋ก ์ ๊ทผํ๋ ๊ณณ์ ์ ์ญ ๋ค์์คํ์ด์ค์ globals() ์๋ฃ๊ตฌ์กฐ์ด๋ค. ์ด ์๋ฃ๊ตฌ์กฐ๋ ์ฌ์ ์ผ๋ก ๊ตฌํ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ฌ์ ํ์์ ์ํํ๋ค.
๊ทธ๋๋ ์๋ค๋ฉด ๋ง์ง๋ง์ผ๋ก ์ ๊ทผํ๋ ๊ณณ์ __builtin__ ๋ผ๋ ๋ชจ๋ ๊ฐ์ฒด์์ ์ฐพ๋๋ค. __builtin__ ์ ๋ชจ๋ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ํด๋น ๋ชจ๋ ๋ด๋ถ์ locals() ์ฌ์ ์๋ฃ๊ตฌ์กฐ๋ฅผ ํ์ํ๋ค. ์ฐธ๊ณ ๋ก ๊ฐ์ฅ ์ฒซ๋ฒ์งธ๋ก ํ์ํ๋ ์ง์ญ ๋ค์์คํ์ด์ค ๋ด์ locals() ๋๋ ๋จ์ํ index๋ก ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ๋นจ๋์ง๋ง, __builtin__ ๋ชจ๋ ๊ฐ์ฒด์ locals() ์์๋ ์ฌ์ ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฆ์ผ๋ก ํ์ํ๊ธฐ ๋๋ฌธ์ ์๋์ ์ผ๋ก ์๋๊ฐ ๋๋ฆฌ๋ค.
์์ฒ๋ผ ํ์ ์์์ ๊ฐ ๋จ๊ณ์์์ ํน์ง์ ๋จธ๋ฆฟ์์ ๋๊ณ ํน์ ํจ์ ๋๋ ๋ชจ๋์ ์ํฌํธํ๋ ์๋ ์์ ์ฝ๋๋ฅผ ํตํด์ ์ด๋ป๊ฒ ์์ฑ๋ ์ฝ๋๊ฐ ๊ฐ์ฅ ๋น ๋ฅธ ์ฑ๋ฅ์ ๋ณด์ฅํ๋์ง ๋น๊ตํด๋ณด๋๋ก ํ์.
import math
def test1(x):
res = 1
for _ in range(1000):
res += math.sin(x)
return res
์ด ๋ฐฉ๋ฒ์์๋ ์ฌ์ ํ์์ 2๋ฒ ์งํํ ์ฝ๋์ด๋ค. ๊ฐ์ฅ ๋จผ์ math ๋ผ๋ ๋ชจ๋์ ๋ก๋ํ ๋ 1๋ฒ, ๊ทธ๋ฆฌ๊ณ math ๋ผ๋ ๋ชจ๋ ์์์ sin ํจ์๋ฅผ ์ฐพ๊ธฐ ์ํด 1๋ฒ ์ด 2๋ฒ์ ์งํํ๋ค.
๋ค๋ฅธ ์คํ์ผ์ ์ฝ๋๋ฅผ ์ดํด๋ณด์.
from math import sin
def test2(x):
res = 1
for _ in range(1000):
res += sin(x)
return res
์ด๋ฒ์ ๋ช ์์ ์ผ๋ก sin ํจ์๋ฅผ ์ํฌํธ ํ๋ค. ์ด๋ด ๊ฒฝ์ฐ, sin ์ด๋ผ๋ ํจ์๋ ์ ์ญ ๋ค์์คํ์ด์ค์์ ์ ๊ทผ์ด ๊ฐ๋ฅํด์ง๋ค. ๋ฐ๋ก ์ง์ ์ ์ฝ๋๋ณด๋ค ์ฌ์ ํ์์ ํ ๋ฒ ์คํตํ ์ ์๋ค. ์ด๋ฌํ ์คํ์ผ์ ์ฝ๋๋ ์๋๋ฅผ ๋น ๋ฅด๊ฒ ํด์ค ๋ฟ๋ง ์๋๋ผ ํจ์๋ฅผ ๋ช ์ํ์ฌ ์ด๋ค ๊ธฐ๋ฅ์ด ํ์ํ์ง ์ ๋ฌํ๊ฒ ๋์ด ์ฝ๋ ๊ฐ๋ ์ฑ๋ ๋ํ ์ ์๋ค. ๋ฌผ๋ก ์ด ์ฝ๋๋ ์์ง๊น์ง๋ ์ ์ญ ๋ค์์คํ์ด์ค์์ sin ์ด๋ผ๋ ํจ์๋ฅผ ์ฐพ๊ธฐ ์ํด ์ฌ์ ํ์์ ํ ๋ฒ์ ์งํํด์ผ ํ๋ค.
๋ง์ง๋ง์ผ๋ก ์๋ ์คํ์ผ์ ์ฝ๋๋ฅผ ์ดํด๋ณด์.
import math
def test3(x, func=math.sin):
res = 1
for _ in range(1000):
res += func(x)
return res
์ด๋ฒ์๋ math ๋ชจ๋์ ์ํฌํธํ๊ธด ํ์ง๋ง test3 ์ด๋ผ๋ ํจ์์ func ์ด๋ผ๋ argument์ ๊ธฐ๋ณธ๊ฐ์ math ๋ชจ๋์ sin ํจ์๋ฅผ ์ง์ ํ๋ค. ์ด ๊ฒฝ์ฐ๋ math ๋ชจ๋ ์์์ sin ํจ์๋ฅผ ์ฐพ๋ ์ฌ์ ํ์์ด ํ ๋ฒ ์งํ๋์ง๋ง, test3๊ฐ ์ต์ด๋ก ํธ์ถ ๋ ๋๋ง ์ฐพ๋๋ค. ์๋ํ๋ฉด test3 ์ด๋ผ๋ ํจ์๊ฐ ์ ์๋๊ณ ๋๋ฉด sin ํจ์์ ๋ํ ์ฐธ์กฐ๋ ํจ์ ์ ์ ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ง์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ง์ญ ๋ณ์์ ์ ์ฅ๋๊ณ ์ด๋ ๊ฐ์ฅ ๋น ๋ฅด๊ณ ๊ฐ์ฅ ๋จผ์ ํ์ํ๋ ์ง์ญ ๋ค์์คํ์ด์ค์ locals() ๋ฐฐ์ด์์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด๋ค. ํด๋น ๋ถ๋ถ์ผ๋ก ์ธํด ์ง์ ์ฝ๋๋ณด๋ค๋ ์ข ๋ ๋น ๋ฅด๊ฒ ๋์ํ๋ค.
๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ์ ์์๋์ด์ผ ํ ์ ์ test3 ํจ์๊ฐ ์ ์๋ ์คํ์ผ์ ์ฝ๋๋ ์ฌ์ค pythonicํ ์ฝ๋๋ ์๋๋ค. ๋ฌผ๋ก ์ด๋ ๊ฒ ์ถ๊ฐ ์ฌ์ ํ์์ ์คํตํ๋๋ก ๊ฐ์ ํจ์ผ๋ก์จ ์ฑ๋ฅ ์ ํ๋ฅผ ๋ง์ ์ ์๊ธด ํ์ง๋ง ๋ณดํต ํน์ ํจ์๋ฅผ ์์ฒญ๋๊ฒ ๋ง์ด ํธ์ถํ ๋์๋ ์ถ๊ฐ ์ฌ์ ํ์์ผ๋ก ์ธํ ์ฑ๋ฅ ์ ํ๋ฅผ ๋ฐ๊ฒฌํ ์ ์๋ค๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ํด๋น ํจ์ ํธ์ถ์ ๋ง์ด ํ์ง ์๋ ์ํฉ์ด๋ผ๋ฉด pythonic ํ ์ฝ๋๋ฅผ ์ ์งํ test2 ํจ์๋ฅผ ์ ์ํ ์คํ์ผ์ ์ฝ๋๊ฐ ๋ ์ ์ ํ ์ ์๋ค.
์ด๋ ๊ฒ ํด์ ํ์ด์ฌ์ ์๋ฃ๊ตฌ์กฐ์ธ ์ฌ์ ๊ณผ ์ , ๊ทธ๋ฆฌ๊ณ ๋ ๋์๊ฐ ์ฌ์ ํ์์ ์ํํ๋ ํ์ด์ฌ์ ๋ค์์คํ์ด์ค์ ๋ํด์๋ ์ถ๊ฐ๋ก ์์๋ณด์๋ค. ๋ค์ ํฌ์คํ ์์๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ์ ์ฅํ์ง ์๊ณ ๋ ๋ฐ์ดํฐ ์์๋ฅผ ์ ์ดํ ์ ์๋ ์ ๋ค๋ ์ดํฐ์ ๋ํด ์์๋ณด์.