Everything is object in Python.
Python ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ
๋ถ์คํธ์บ ํ AI Tech 1๊ธฐ์์ ๊ฐ์๋ฅผ ๋ฃ๋ ์ค Python์ ๋ณ์ ํ ๋น๊ณผ ==์ is ๋น๊ต ์ฐ์ฐ์์ ๋ํด ๋ฐฐ์ฐ๊ฒ ๋์๋ค.
๋ณ์์ ๊ฐ์ ํ ๋นํ ๋ ๋๋ ๋งค๊ฐ๋ณ์๋ก ๊ฐ์ ์ ๋ฌํ ๋, Python์ C/C++ ๋๋ Java์ ๋ฐฉ์๊ณผ ๋ญ๊ฐ ๋ค๋ฅด๋ค๋ ์ ์ ๊นจ๋ซ๊ฒ ๋์๋ค.
๊ถ๊ธํ ์ ์ ์ฐพ์๋ณด๋ค๊ฐ ์ผ๋จ๊ฒฐ์ Python์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ฐฉ์์ ๋ํด ๋นก๊ณต์ ํ๊ฒ ๋์๋ค.
๋ญ๊ฐ ๋ค๋ฅด๋ค๋ ๊ฒ์ ์๊ฒ ๋๋ฐ ์ดํด๊ฐ ์ ๋์ง ์์์ ํผ์ด ์ธ์ ๋ ํ์ ๋ถ๋ค๊ณผ ํจ๊ป ์ด์ผ๊ธฐํด๋ณด๊ฒ ๋์๊ณ ,
Python์ Mutable ๊ฐ์ฒด์ Immutable ๊ฐ์ฒด์ ๋ํด ๋ฃ๊ฒ ๋์๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ์ธ ํ์ต ์๊ฐ์ ์ถ๊ฐ์ ์ผ๋ก Python์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๋ํด ์ฐพ์๋ณด๋ฉด์ ์๋นํ ํฅ๋ฏธ๋ก์ด ๋ด์ฉ๋ค์ ๋ฐ๊ฒฌํ๋ค!๐ฅณ
1. Mutable๊ณผ Immutable ํ์
- Immutable : ์ซ์(number), ๋ฌธ์์ด(string), ํํ(tuple)
- Mutable : ๋ฆฌ์คํธ(list), ๋์ ๋๋ฆฌ(dictionary), NumPy์ ๋ฐฐ์ด(ndarray)
- Immutable ํ์
์๋์ ์์ค์ฝ๋๋ฅผ ๋ณผ ๋, C/C++๊ณผ ๊ฐ์ ์ธ์ด๋ b = a๊ฐ ์คํ๋๋ฉด ๊ฐ์ a์์ b๋ก ๋ณต์ฌํ๋ ๊ฒ์ผ๋ก ๋ณผ ์ ์๋ค.
๊ทธ๋ฌ๋ Python์ Everyting is object ์ ์ ์ ์ง๋๊ณ ์๋ค.
๋ญ๊ฐ ๋ค๋ฅด๋ค.
a = 9999
b = a
c = 9999
print(f'initial a({a}): {str(id(a))}')
print(f'initial b({b}): {str(id(b))}')
print(f'initial c({c}): {str(id(c))}')
print('---------------------------------')
b = 10000
print(f'modified a({a}): {str(id(a))}')
print(f'modified b({b}): {str(id(b))}')
c = 123
print(f'modified c({c}): {str(id(c))}')
# ๊ฒฐ๊ณผ
initial a(9999): 140187690856656
initial b(9999): 140187690856656
initial c(9999): 140187690856656
---------------------------------
modified a(9999): 140187690856656
modified b(10000): 140187690856624
modified c(123): 4508199520
Python์ ๊ฐ ํ ๋น์ 9999๋ผ๋ int object๋ฅผ ๋ง๋ค๊ณ , ๋ณ์ a๊ฐ ์ด๊ฒ์ ๊ฐ๋ฆฌํค๋ ๋ฐฉ์์ผ๋ก ์๋ํ๋ค.
b = a ๋ฌธ์ฅ์ด ์คํ๋๋ฉด ๋ณ์ b๋ ์ด๋ฏธ ๋ง๋ค์ด์ง 9999๋ผ๋ int object๋ฅผ ๊ทธ๋ฅ ๊ฐ๋ฆฌํค๊ธฐ๋ง ํ๋ ๊ฒ์ด๋ค.
๋ณ์์ ๊ณ ์ ๊ฐ(๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์)์ ์๋ ค์ฃผ๋ id() ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ฉด ์ด๋ฅผ ๋์ฑ ์ง๊ด์ ์ผ๋ก ํ์ธํ ์ ์๋ค.
์ ์์ค์ฝ๋์ ๋ํ ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด a์ id๋ 140187690856656๋ผ๋ ๊ฐ์ ๊ฐ๋๋ค.
์ด์ด์, a๋ก๋ถํฐ ๋ฌด์ธ๊ฐ๋ฅผ ๋๊ฒจ๋ฐ์ b๋ ๋์ผํ ๊ฐ์ธ 140187690856656๋ฅผ id๋ก ๊ฐ๋๋ค.
c๋ ์ด๊ธฐ๊ฐ์ด 9999๋ก ๋์ผํ๋ฐ, id๊ฐ 140187690856656์ธ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์๋ก ๋ค๋ฅธ ๋ณ์์ผ์ง๋ผ๋ ๊ฐ์ ๊ฐ์ ํ ๋น๋ฐ๋๋ค๋ฉด ๊ฐ์ int ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๊ณ ,
๊ฐ์ด ๋ณํ๋ค๋ฉด ๋ ๋ค๋ฅธ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ด๊ฒ์ ๊ฐ๋ฆฌํค๊ฒ ๋๋ ๊ฒ์ด๋ค.
Immutable ํ์ ์ธ ์ซ์/๋ฌธ์์ด/ํํ์ ๋ชจ๋ ๋์ผํ๊ฒ ์๋ํ๋ค.
๐ ์ฐธ๊ณ
๊ฐ์ ๊ฐ์ด์ด๋ ์คํํ ๋๋ง๋ค ๋ค๋ฅธ ์ฃผ์๋ฅผ ๊ฐ๋๋ค.
a = 100์ด ์ฒ์ ์ ์ธ๋์์ ๋, 100์ ์ฃผ์๋ ๊ทธ๋๊ทธ๋ ๋ค๋ฅด๋ค๋ ๊ฒ์ด๋ค.
a = 100
print(id(a))
์ค์ ๋ก ์ด ์ฝ๋๋ฅผ ์คํํ๋ฉด, ๋งค๋ฒ ๋ค๋ฅธ id ๊ฐ์ ๊ฐ๋๋ค๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
- Mutable ํ์
x = [1,2,3]
y = x
y += [4,]
print(x) # [1,2,3,4]
print(y) # [1,2,3,4]
์์์ ๋๋ฒ์งธ ์ค๊น์ง ์คํํ๋ฉด x, y๋ ๋ชจ๋ [1,2,3]์ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค. ์ดํ y๋ฅผ ๋ณ๊ฒฝํ๋ฉด x ์ญ์๋ ๋ณ๊ฒฝ๋๊ฒ ๋๋ค.
์ฆ, C/C++ ๊ด์ ์์ ๋ณด๋ฉด ํฌ์ธํฐ ์ฐ์ฐ ๋๋ ๋ ํ๋ฐ์ค ๋ณ์๋ก ์ ์ธํ ๊ฒ๊ณผ ์ ์ฌํจ์ ์ ์ ์๋ค.
์ฐ๊ธฐ๊ฐ ๊ฐ๋ฅํ ์ปจํ ์ด๋๋ mutable ์ด๋ฏ๋ก shallow copy ๊ฐ ๋๋ ๊ฒ์ผ๋ก ์ดํดํ ์๋ ์๋ค.
immutable ํ์ ์ ์ง์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ deep copy๋ก ์ดํดํ ์ ์๋ค.
๋ฐ๋ฉด, mutable ํ์ ์ ๋ด๋ถ์ ์ผ๋ก shallow copy๋ง์ ์ ์ฉํ๋ค.
์ด๋ copy.deepcopy()๋ฅผ ํตํด deep copy๋ฅผ ํ ์ ์๊ฒ ๋๋ค.
2. Python์ ๋งค๊ฐ๋ณ์ ์ ๋ฌ
- Immutable ํ์
def foo(a):
print(f'local a: {a}') # local a: 100
print(f'local id: {id(a)}') # local id: 4411828096
a += 2
print(f'local changed a: {a}') # local changed a: 102
print(f'local changed id: {id(a)}') # local changed id: 4411828160
a = 100
print(f'main a: {a}') # main a: 100
print(f'main id: {id(a)}') # main id: 4411828096
foo(a)
Immutable ํ์ ์ ํจ์์ ํ๋ผ๋ฏธํฐ๋ก ๊ฐ์ ๋๊ธธ ๋, Call by value์ฒ๋ผ ์์ฉํ๋ค.
foo ํจ์์ a์ ๋ฐ๊นฅ์ a๋ ์ด๋ฆ๋ ๊ฐ๊ณ , ๊ฐ์ 100์ด๋ผ๋ int object๋ฅผ ๊ฐ๋ฆฌํค์ง๋ง foo ํจ์์์ ์์ ํ๋ฉด์ ๋ค๋ฅธ int object๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค. ์ด์ ์ ๋๊ฒจ๋ฐ์ a์๋ ์๋ฌด๋ฐ ์ํฅ์ ์ฃผ์ง ์๊ฒ ๋๋ค.
๋ง์น C/C++์์ ํจ์์ ๋งค๊ฐ๋ณ์๋ฅผ ๋๊ฒจ์ค ๋ Call by value์ฒ๋ผ ๋ง์ด๋ค.
- Mutable ํ์
def foo(a):
print(f'local a: {a}') # local a: []
print(f'local id: {id(a)}') # local id: 140404441297376
a.append(1)
print(f'local changed a: {a}') # local changed a: [1]
print(f'local changed id: {id(a)}') # local changed id: 140404441297376
a = []
print(f'main a: {a}') # main a: []
print(f'main id: {id(a)}') # main id: 140404441297376
foo(a)
print(f'main changed a: {a}') # main changed a: [1]
print(f'main changed id: {id(a)}') # main changed id: 140404441297376
Mutable ํ์ ์ ํจ์์ ํ๋ผ๋ฏธํฐ๋ก ๊ฐ์ ๋๊ธธ ๋, Call by reference์ฒ๋ผ ์์ฉํ๋ค.
mutableํ๋ฏ๋ก ๋์ผํ list object์ ๊ฐ์ ์ถ๊ฐํ๊ฒ ๋๊ณ , ์ด๋ ๋ฐ๊นฅ์ list์ธ a์ ์ถ๊ฐํ๋ ๊ฒ๊ณผ ๋์ผํ๋ค.
๋ง๋ฌด๋ฆฌ
Mutableํ์ง, Immutable ํ ์ง์ ๋ฐ๋ผ ๋ฉ๋ชจ๋ฆฌ์์ ์์ฉํ๋ ๋ฐฉ์์ด ๋ค๋ฅด๋ค๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
Python์ ์ข ๋ ์ดํดํ ์ ์๊ฒ ๋ ๋งํผ, ์์ผ๋ก ํ์ด์ฌ์ผ๋ก ์ฝ๋ฉํ ๋ ๋ ๊น๊ฒ ์ดํดํ ์ ์์ ๊ฒ ๊ฐ๋ค.
๋ง---์กฑ๐
- ์ฐธ์กฐ
1. ๊ณตํ์๋ฅผ ์ํ Python 2.1.7 mutable vs immutable(https://wikidocs.net/32277)
2. python ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ(memory allocation)(https://leemoney93.tistory.com/25)
3. Python์ Call by assignment ๊ฐ๋ (https://jins-dev.tistory.com/entry/Python-%EC%9D%98-Call-by-assignment-%EC%9D%98-%EA%B0%9C%EB%85%90)
'Languages > Python ๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Python] python์ ๋ณ์ ์ค์ฝํ (0) | 2021.12.02 |
---|---|
[Python] Handling (Exception, File, Directory, Data) (0) | 2021.01.22 |
[Python] Python์ ์๋ฃ๊ตฌ์กฐ (0) | 2021.01.21 |