๋ฐฑ์ค์ ํ๋ค๊ฐ ํ์ด์ฌ์ ๋ณ์๋ฅผ ๋์ ํ ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ ์ข ๋ค๋ฅด๊ฒ ํ ๋น๋๋ ๊ฒ ๊ฐ์์
์์๋ณด๋ mutable, immutable ๊ฐ์ฒด์ ๋ฐ๋ผ ๋ค๋ฅธ ์ ์ด ์๋ค๋ ๊ฒ์,, ์๊ฒ ๋์๋ค.
๊ทธ๋์ ๊ณต๋ถํ๊ณ ์ฐ๋ ๊ธ ใฐ๏ธ
๐ mutable ๊ฐ์ฒด์ immutable ๊ฐ์ฒด์ ๋น๊ต
ํ์ด์ฌ์์ ๊ฐ์ฒด๋ mutable, immutable๋ก ๋๋ ์ ์๋๋ฐ,
list / set / dict ๋ฑ์ mutable ๊ฐ์ฒด, bool / int / str ๋ฑ์ immutable ๊ฐ์ฒด์ด๋ค.
๐ ๊ตฌ๋ถ ๋ฐฉ๋ฒ
list ์ฒ๋ผ ํ๋ ํ๋์ ์์๋ฅผ ๋ฐ๊ฟ์ ์ ์ฅํ ์ ์๋ ๊ฐ์ฒด๋ mutable,
str์ฒ๋ผ ํ๋ ํ๋์ ์์๋ง์ ๋ฐ๊ฟ ์ ์ฅํ ์ ์๋ ๊ฐ์ฒด๋ immutable์ด๋ผ๊ณ ์๊ฐํ๋ฉด ์ฝ๋ค.
์๋ ์ฝ๋์ list, str์ ๋ํ๋ก mutable ๊ฐ์ฒด์ immutable ๊ฐ์ฒด๋ฅผ ๊ฐ๋จํ ๋น๊ตํ๋ค.
a = [1, 2, 3]
print(id(a)) # output : 4507373056
a[0] = 0
print(id(a)) # output : 4507373056
b = "abc"
print(id(b)) # output : 4507295344
# b[0] = "d" ํ๋์ ๊ธ์ ๋ณ๊ฒฝ ๋ถ๊ฐ
b = "def"
print(id(b)) # output : 4507969456
- ๋ฆฌ์คํธ a์ [1, 2, 3]์ ์ต์ด๋ก ์ ์ฅํ๊ณ , a[0]์ 0์ผ๋ก ๋ฐ๊ฟ์ฃผ์๋๋ฐ,
[0]์ 0์ ๋ฃ๊ธฐ ์ ๊ณผ ํ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ ๊ฐ์ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ด๋ list๊ฐ mutable ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ ๊ฒ์ด๋ค. - str์ผ๋ก ์ ์ธ๋ b์ ๊ฒฝ์ฐ์๋ ํ๋ ํ๋์ ์์๋ฅผ ๋ฐ๊ฟ ์๋ ์๊ณ ,
๋ฐ๋ผ์ ์ ์ฒด ๊ฐ์ ์๋ก ์ ์ฅํด์ฃผ์ด์ผ๋ง ๊ฐ์ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค.
์ด ๊ฒฝ์ฐ ์์ ์๋ก์ด ๊ฐ์ ๋ค์ ํ ๋นํ๋ ๊ฒ์ด๋ฏ๋ก ๋น์ฐํ๊ฒ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ ๋ฌ๋ผ์ง๋ค.
๐ mutable ๊ฐ์ฒด์ immutable ๊ฐ์ฒด์ ๋ณ์ ๋์ ๋น๊ต - ์์ ๋ณต์ฌ
mutable๊ณผ immutable ๋ชจ๋ ๊ทธ๋ฅ ๋ณ์์ ๋์ ํ ๋๋ '์์ ๋ณต์ฌ'๋ผ๋ ๊ฒ์ ํ๊ฒ ๋๋ค.
(์ฌ๋ผ์ด์ฑ๋ ์์ ๋ณต์ฌ, copy ๋ชจ๋์ copy ๋ฉ์๋๋ ์์ ๋ณต์ฌ)
์์ ๋ณต์ฌ๋ฅผ ํ๋ฉด ์ด๋ค ์ผ์ด ์๊ธฐ๋์ง ์๋ ์ฝ๋์์ ํ์ธํ์.
mutable ๊ฐ์ฒด์ immutable ๊ฐ์ฒด์ ๊ฐ๊ฐ ๋ณ์๋ฅผ ๋์ ํ์ ๋์ ๊ฒฐ๊ณผ๋ฅผ ์ฝ๋๋ก ์์ฑํ๋ค.
x1 = [1, 2, 3]
x2 = x1
x2[0] = 0
print(x1, x2) # output : [0, 2, 3] [0, 2, 3]
print(id(x1), id(x2)) # output : 4481772864 4481772864
y1 = "abc"
y2 = y1
y2 = "def"
print(y1, y2) # output : abc def
print(id(y1), id(y2)) # output : 4516896368 4517570352
- x1์ [1, 2, 3]์ ์ ์ฅํ๊ณ , x2์ x1์ ์ ์ฅํด์ฃผ์๊ณ , x2[0]๋ฅผ 0์ผ๋ก ๋ฐ๊ฟ์ฃผ์๋ค.
์ด ๋ x1๊ณผ x2์ ์ ์ฅ๋ ๊ฐ์ ํ์ธํ๋ฉด ๋ ๋ค [0, 2, 3]์ผ๋ก ๊ฐ์ ๊ฒ์ ์ ์ ์๋ค.
์ด์ ๋ ๊ฐ ๋ฆฌ์คํธ์ ์ฃผ์๋ฅผ ํ์ธํ ๊ฒฐ๊ณผ๋ก ์ ์ ์๋๋ฐ, x1๊ณผ x2๋ ๊ฐ์ ์ฃผ์๋ฅผ ๊ฐ์ง๋ค. - y1์๋ "abc" str ๊ฐ์ ํ ๋นํ๊ณ , y2์ y1์ ๋ฃ์ด์ฃผ์๋ค.
๊ทธ๋ฆฌ๊ณ ์์์ ๋งํ๋ฏ์ด immutable ๊ฐ์ฒด๋ ํ๋ ํ๋์ ์์๋ฅผ ๋ณํํ๋ ๊ฒ์ด ๋ถ๊ฐํ๋ฏ๋ก
y2์๋ ์์ ์๋ก์ด ๊ฐ์ ๋ค์ ํ ๋นํด์ฃผ์๋ค.
๊ทธ๋ฌ๋ ๋น์ฐํ๊ฒ๋ y1, y2๋ ๋ค๋ฅธ ๊ฐ์ ๊ฐ์ง๊ณ , ์ฃผ์๋ ๋ค๋ฅธ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๐ ๊น์ ๋ณต์ฌ
๋ฆฌ์คํธ ๊ฐ์ mutable ๊ฐ์ฒด๋ค์๊ฒ ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ฃผ์ ์ถ๋ค๋ฉด ๊น์ ๋ณต์ฌ๋ฅผ ์ฌ์ฉํด์ฃผ๋ฉด ๋๋ค.
๊น์ ๋ณต์ฌ๋ copy ๋ชจ๋์ importํ๊ณ , deepcopy ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
import copy
deep_a = [1, 2, 3]
deep_b = copy.deepcopy(deep_a)
print(id(deep_a), id(deep_b)) # output : 4520427392 4520425664
deep_b[0] = 0
print(deep_a, deep_b) # output : [1, 2, 3] [0, 2, 3]
- [1, 2, 3]์ ์ ์ฅํ deep_a ๋ฆฌ์คํธ๋ฅผ deepcopy ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ deep_b์ ํ ๋นํ๋ค.
์ด ๊ฒฝ์ฐ id๋ฅผ ํ์ธํ์ ๋, ์๋ก ๋ค๋ฅธ ์ฃผ์๋ฅผ ๊ฐ์ง๋ ๊ฒ์ ์ ์ ์๋ค. - deep_b[0]์ 0์ผ๋ก ๋ฐ๊ฟ์ฃผ์์ ๋๋ ์๋ก ๊ฐ๋ฆฌํค๋ ์ฃผ์๊ฐ ๋ค๋ฅด๋
๋น์ฐํ๊ฒ๋ ์๋ก ์ํฅ์ ์ฃผ์ง ์๋ ๋ชจ์ต์ ํ์ธํ ์ ์๋ค.
๐ ์์ฝ
mutable ๊ฐ์ฒด(๋ํ์ ์ผ๋ก list)๋ ๊น์ ๋ณต์ฌ๋ฅผ ์ฌ์ฉํด์ฃผ์ง ์์ผ๋ฉด ๋ณ์ ๋์
์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๋ฏ๋ก,
์์ ํ ์์ํ๊ฒ ํ ๋น๋ ๊ฐ๋ง์ ๋ณต์ฌํ๊ณ ์ถ๋ค๋ฉด copy ๋ชจ๋์ deepcopy ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ฃผ์ด์ผ ํ๋ค.
'4๏ธโฃ Python > Python ์ ๋ฆฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Python] ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด ์ ํ์ํ ์ฃผ์ ํ (sys.setrecursionlimit(), sys.stdin.readline()) (0) | 2022.01.30 |
---|---|
[Python] ๋ฆฌ์คํธ ๊ด๋ จ ํจ์ ์ด์ ๋ฆฌ! (0) | 2021.11.15 |
[Python] ์ ์ถ๋ ฅ ์ ๋ฆฌ (0) | 2021.11.15 |
๋๊ธ