์์ ๋ณต์ฌ(shallow copy)์ ๊น์ ๋ณต์ฌ(deep copy) + 2์ฐจ์ ๋ฐฐ์ด ์ ์ธ
๐ mutable
> list, set, dict
๐ immutable
> bool, int, float, str, tuple, frozenset
๋ณ์ ๊ฐ ๋์
mutableํ ๊ฐ์ฒด์ ๋ณ์ ๊ฐ ๋์
a = [1, 2, 3]
b = a # shallow copy
b[0] = 5
a
>>> [5, 2, 3]
b
>>> [5, 2, 3]
id(a)
>>> 4396179528
id(b)
>>> 4396179528
โจ list์ ์์ ๋ณต์ฌ
b์ a๋ฅผ ํ ๋นํ๋ฉด ๊ฐ์ด ํ ๋น๋๋ ๊ฒ์ด ์๋๋ผ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋ฐ๋ผ๋ณธ๋ค.
๋ฐ๋ผ์ b๋ฅผ ๋ณ๊ฒฝํ๋ฉด a๋ ๊ฐ์ด ๋ฐ๋๋ค.
mutableํ ๋ค๋ฅธ ๊ฐ์ฒด ๋ํ ๋๊ฐ์ ํ์์ด ๋ํ๋๋ค.
immutableํ ๊ฐ์ฒด์ ๋ณ์ ๊ฐ ๋์
a = "abc"
b = a
a
>>> 'abc'
b
>>> 'abc'
id(a)
>>> 4387454680
id(b)
>>> 4387454680
b = "abcd"
a
>>> 'abc'
b
>>> 'abcd'
id(a)
>>> 4387454680
id(b)
>>> 4396456400
โจ str ๋ฌธ์์ด์ ์์ ๋ณต์ฌ
list์ ๋๊ฐ์ด b์ a๋ฅผ ํ ๋นํ๋ฉด ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋ฐ๋ผ๋ณด๊ฒ ๋๋ค.
ํ์ง๋ง b์ ๋ค๋ฅธ ๊ฐ์ ํ ๋นํ๋ฉด ์ฌํ ๋น์ด ์ด๋ฃจ์ด์ง๋ฉฐ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ ๋ณ๊ฒฝ๋๋ค.
๋ฐ๋ผ์ a์ b๋ ๋ค๋ฅธ ๊ฐ์ ๊ฐ๋๋ค.
๐ ์์ ๋ณต์ฌ (shallow copy)
list์ ์ฌ๋ผ์ด์ฑ์ ํตํด์ ๊ฐ์ ํ ๋นํ๋ฉด ์๋ก์ด id๊ฐ ๋ถ์ฌ๋๋ฉฐ ์๋ก ์ํฅ์ ๋ฐ์ง ์๋๋ค.
a = [1,2,3]
b = a[:]
id(a)
>>> 4396179528
id(b)
>>> 4393788808
a == b
>>> True
a is b
>>> False
b[0] = 5
a
>>> [1, 2, 3]
b
>>> [5, 2, 3]
ํ์ง๋ง ์ด๋ฌํ ์ฌ๋ผ์ด์ฑ ๋ํ ์์ ๋ณต์ฌ์ ํด๋น๋๋ค.
๋ฆฌ์คํธ ์์ ๋ฆฌ์คํธ mutable ๊ฐ์ฒด ์์ mutable ๊ฐ์ฒด์ธ ๊ฒฝ์ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
a = [[1,2], [3,4]]
b = a[:]
id(a)
>>> 4395624328
id(b)
>>> 4396179592
id(a[0])
>>> 4396116040
id(b[0])
>>> 4396116040
id(a)์ id(b) ๊ฐ์ ๋ค๋ฅด์ง๋ง, ๊ทธ ๋ด๋ถ์ ๊ฐ์ฒด id(a[0])์ id(b[0])์ ๊ฐ์ ์ฃผ์๋ฅผ ๋ฐ๋ผ๋ณด๊ณ ์๋ค.
์ด๋ ์ฌํ ๋นํ๋ ๊ฒฝ์ฐ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ์ด ๋ณ๊ฒฝ๋์ด ๋ฌธ์ ๊ฐ ์๋ค.
ํ์ง๋ง ์ฌํ ๋นํ์ง ์์ a[1] ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด b[1]๋ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ค.
a[0] = [8,9] # ์ฌํ ๋น
a
>>> [[8, 9], [3, 4]]
b
>>> [[1, 2], [3, 4]]
# ๋ฐ๋ผ๋ณด๋ ์ฃผ์๊ฐ ๋ค๋ฆ
id(a[0])
>>> 4393788808
id(b[0])
>>> 4396116040
a[1].append(5)
a
>>> [[8, 9], [3, 4, 5]]
b
>>> [[1, 2], [3, 4, 5]]
# ๋ฐ๋ผ๋ณด๋ ์ฃผ์๊ฐ ๊ฐ์
id(a[1])
>>> 4396389896
id(b[1])
>>> 4396389896
โจ copy ๋ชจ๋์ copy ๋ฉ์๋ ๋ํ ์์ ๋ณต์ฌ์ด๋ค.
import copy
a = [[1,2], [3,4]]
b = copy.copy(a)
a[1].append(5)
a
>>> [[1, 2], [3, 4, 5]]
b
>>> [[1, 2], [3, 4, 5]]
๐ ๊น์ ๋ณต์ฌ (deep copy)
๊น์ ๋ณต์ฌ๋ ๋ด๋ถ์ ๊ฐ์ฒด๋ค๊น์ง ๋ชจ๋ ์๋กญ๊ฒ copy๋๋ ๊ฒ์ด๋ค.
copy.deepcopy ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
import copy
a = [[1,2], [3,4]]
b = copy.deepcopy(a)
a[1].append(5)
a
>>> [[1, 2], [3, 4, 5]]
b
>>> [[1, 2], [3, 4]]
โจ 2์ฐจ์ ๋ฐฐ์ด ์ ์ธ ๋ฐฉ๋ฒ
# ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ
arr = [[0 for col in range(10)] for row in range(10)]
# ์๋ชป๋ ๋ฐฉ๋ฒ
arr = [[0] * 10] * 10
์๋ชป๋ ๋ฐฉ๋ฒ์ฒ๋ผ * ์ฐ์ฐ์๋ก 2์ฐจ์ ๋ฐฐ์ด์ ์ด๊ธฐํํ๋ฉด ๊ฐ์ ๊ฐ๊ฐ ํ ๋นํ์ง ์๊ณ ํ๋์ ๊ฐ์ฒด๋ง์ ์์ฑํ ๋ค,
๋ชจ๋๊ฐ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์์ ์ฃผ์๊ฐ์ ๊ฐ๋ ์์ ๋ณต์ฌ๋ฅผ ์งํํ๋ค.
์๋ฅผ ๋ค์ด, [0] * 3 ์ ๋ฐฉ์์ ๋ฆฌ์คํธ์ [0]๋ฒ, [1]๋ฒ, [2]๋ฒ์ด ๋ชจ๋ [0] ์ด๋ผ๋ ํ๋์ ๊ฐ์ฒด๋ฅผ ๋ฐ์ธ๋ฉํ๊ฒ ๋๋ค.
๋ฐ๋ผ์ 2์ฐจ์ ๋ฐฐ์ด์์ ํน์ ์นธ์ ๊ฐ์ ๋ฐ๊พธ๋ฉด ํด๋น ์ด์ ๋ชจ๋ ๊ฐ์ด ๋ฐ๋๊ฒ ๋๋ค.