ํ์ด์ฌ ๊น์ ๋ณต์ฌ, ์์ ๋ณต์ฌ (shallow copy, deep copy)
2021. 5. 18. 02:46ใBackend/๐ Python
ํ์ด์ฌ ๊ฐ์ฒด ๋ณต์ฌ
- ๊ฐ์ฒด์ ๋ณต์ฌ ์ข ๋ฅ: copy, shallow copy, deep copy
์ผ๋ฐ ๋ณต์ฌ, copy
- ์๋ณธ ๊ฐ์ฒด์ ์ฐธ์กฐ๊ฐ๊น์ง ๋ณต์ฌํ๊ธฐ ๋๋ฌธ์, ๋ณต์ฌ๋ ๊ฐ์ฒด์ ์์๊ฐ ๋ฌ๋ผ์ง๋ฉด ์๋ณธ ๊ฐ์ฒด๋ ๋ฌ๋ผ์ง๋ค.
- ํน๋ณํ ๋ฉ์๋ ์ฌ์ฉ์ด ์๋, ๊ทธ์ ๊ฐ์ฒดํ ๋น์ผ๋ก ๋ณต์ฌ.
# Ex 1 - Copy
# call by value, call by refference, call by share
a_list = [1, 2, 3, [4, 5, 6], [7, 8, 9]]
b_list = a_list
print('Ex 1 > ', id(a_list))
print('Ex 1 > ', id(b_list)) # b_list ๋ a_list ๋ฅผ ํ ๋น๋ฐ๊ธฐ ๋๋ฌธ์
# ๊ฐ์ ์ฃผ์ ์ฐธ์กฐ์์ ํ์ธ ๊ฐ๋ฅ
>>> Ex 1 > 4384525248
>>> Ex 1 > 4384525248
b_list[2] = 100
print('Ex 1 > ', id(a_list), a_list) # b_list[2] ์ ํ ๋นํ๋๋ฐ, a_list ๋ ๋ณ๊ฒฝ๋๋ค.
print('Ex 1 > ', id(b_list), b_list)
# ์ฌ์ ํ ๊ฐ๋ค => call by reference
>>> Ex 1 > 4384525248 [1, 2, 100, [4, 5, 6], [7, 8, 9]]
>>> Ex 1 > 4384525248 [1, 2, 100, [4, 5, 6], [7, 8, 9]]
์์ ๋ณต์ฌ, shallow copy
- ์ผ๋ฐ copy์ ๋ฌ๋ฆฌ, copy ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํฌํธ ํ์, copy.copy() ๋ฉ์๋๋ก ๋ณต์ฌํ๋ค.
- shallow copy๋ ์๋ณธ ๊ฐ์ฒด์ ๋ค๋ฅธ ์ฐธ์กฐ๊ฐ์ ์์ฑํ๋ค. (์ผ๋ฐ copy๋ ์๋ณธ ๊ฐ์ฒด์ ๊ฐ์ ์ฐธ์กฐ๊ฐ ์์ฑ)
# Ex 2 - Shallow Copy: ์์ ๋ณต์ฌ
import copy
c_list = [1, 2, 3, [4, 5, 6], [7, 8, 9]]
d_list = copy.copy(c_list)
print('Ex 2 > ', id(c_list)) # Ex 2 > 4384526976
print('Ex 2 > ', id(d_list)) # Ex 2 > 4384527424
# ์ฐธ์กฐํ์ ์ฃผ์๊ฐ์ ๊ณต์ ํ๋ ์ด์ ๊ณผ๋ ๋ฌ๋ฆฌ, ์ง๊ธ์ ์ฃผ์๊ฐ์ด ๋ค๋ฅด๋ค.
# ์ด ๋ฐฉ๋ฒ์ ์ด๋ ๊ฐ์ฒด์ ์ฌ๋ณธ์ ๋ง๋ฆ์ผ๋ก, ๋ณธ ๊ฐ์ฒด๋ฅผ ๊ฑด๋๋ฆฌ์ง ์๊ณ ์ฌ๋ณธ์ ๋ง๋ค ์ ์๋ค.
d_list[1] = 100
print('Ex 2 > ', (c_list)) # Ex 2 > [1, 2, 3, [4, 5, 6], [7, 8, 9]]
print('Ex 2 > ', (d_list)) # Ex 2 > [1, 100, 3, [4, 5, 6], [7, 8, 9]]
# d_list์๋ง 100 ๋ค์ด๊ฐ
d_list[3].append(1000)
d_list[4][1] = 10000
print('Ex 2 > ', (c_list)) # Ex 2 > [1, 2, 3, [4, 5, 6, 1000], [7, 10000, 9]]
print('Ex 2 > ', (d_list)) # Ex 2 > [1, 100, 3, [4, 5, 6, 1000], [7, 10000, 9]]
# ์์ ๋ณต์ฌ์ด๊ธฐ ๋๋ฌธ์, ์ค์ฒฉ๋ ๊ฐ์ฒด์ ๋ํด์ ์๋ณต ๊ฐ์ฒด๋ ๊ทธ๋๋ก ๋ณ๊ฒฝ์ด ์ผ์ด๋ฌ๋ค.(์๋ณธ์ ์งํค์ง ๋ชปํจ: ์๋ณธ์ ์๋ฏธ๊ฐ ์๋ค)
# ์์ ๋ณต์ฌ๋ ์ธ๋ถ ๊ฐ์ฒด๊น์ง ๋ณต์ฌํ์ง ๋ชปํ๋ค : call by reference
์ ๋ฆฌ
1) ์์ ๋ณต์ฌ - copy.copy(๊ฐ์ฒด) ์ ๋ํด 1์ฐจ ๋ฐฐ์ด(๋ฆฌ์คํธ)๋ ์๋ณธ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝ์ํค์ง ์๋ ์ฌ๋ณธ์ ์์ฑํด๋ธ๋ค.
2) ๋ฌธ์ : 2์ฐจ ์ด์์ ๋ฐฐ์ด, ์ค์ฒฉ๋ ๊ฐ์ฒด๋ ์๋ณธ๊ฐ์ฒด๋ฅผ ์งํค์ง ๋ชปํ๋ค. ์ฆ ์๋ฒฝํ ๊ฐ์ฒด ๋ณต์ฌ๋ฅผ ํ์ง ๋ชปํ๋ค.
๊น์ ๋ณต์ฌ, deep copy
- shallow copy๋ ์ค์ฒฉ ๊ฐ์ฒด(ex 2์ฐจ ์ด์์ ๋ฆฌ์คํธ)์ ์์ญ๊น์ง ๋ณต์ฌ๋ฅผ ํ์ง ๋ชปํ๋ค. (๊ทธ๋์ shallow copy)
- ๊น์ ๋ณต์ฌ๋ ์ด๋ฐ ํ๊ณ์ ์ ๋์ด ์ค์ฒฉ ๊ฐ์ฒด์ ๋ํด์๋ ์๋ฒฝํ ๋ณต์ฌํ ์ ์๋ค.
- copy.deepcopy() ๋ฉ์๋ ์ฌ์ฉ.
# Ex 3 - Deep Copy : ๊น์ ๋ณต์ฌ
e_list = [1, 2, 3, [4, 5, 6], [7, 8, 9]]
f_list = copy.deepcopy(e_list) # ์์ ๋ณต์ฌ๋ copy.copy() <--> ๊น์ ๋ณต์ฌ๋ copy.deepcopy()
f_list[3].append(1000)
f_list[4][1] = 10000
print('Ex3 > ', id(e_list), e_list) # Ex3 > 4309846592 [1, 2, 3, [4, 5, 6], [7, 8, 9]]
print('Ex3 > ', id(f_list), f_list) # Ex3 > 4308765632 [1, 2, 3, [4, 5, 6, 1000], [7, 10000, 9]]
# ์ฐ์ ์๋ก๋ค๋ฅธ ์ฃผ์๊ฐ ์ฐธ์กฐ
# f_list ์ e_list ๋ ๋ค๋ฅธ ํํ๋ฅผ ๊ฐ๊ฒ ๋๋ค. ๊น์ ์์๊น์ง ๋ณต์ฌํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ ์ฒด ์ ๋ฆฌ
- ๊ทธ๋ ๋ค๋ฉด ์ ๋ deepcopy๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ ๊น? (shallow copy๋ณด๋ค ๋ง๋ฅ์ฒ๋ผ ๋ณด์ด๋๋ฐ)
- ์ฐ์ ๋ฉ๋ชจ๋ฆฌ ์์.
๋ง์ฝ 1์ต๊ฐ์ ์์ ์ง๋ ๋ฆฌ์คํธ๋ฅผ deepcopy ํ๋ค๋ฉด ๋ฉ๋ชจ๋ฆฌ ์์๊ฐ ์ฌํด์ง๋ค.
์ํฉ์ ๊ณ ๋ คํ์ฌ shallow copy ํ ๊ฒ์ธ์ง deep copy ํ ๊ฒ์ธ์ง ๊ฐ๋ฐ์๊ฐ ๊ฒฐ์ ํ๋ค.
'Backend > ๐ Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ์ด์ฌ ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ, ์ค๋ฒ๋ก๋ฉ (2) | 2021.05.18 |
---|---|
ํ์ด์ฌ lambda, filter, reduce (0) | 2021.05.18 |
์ธํ๋ฐ ๋ฆฌํ2๊ธฐ OT (0) | 2021.03.10 |
[ํ์ด์ฌ] 2์ฐจ์ ๋ฆฌ์คํธ๋ฅผ 1์ฐจ์ ๋ฆฌ์คํธ๋ก ๋ง๋ค๊ธฐ (0) | 2020.12.30 |
ํ์ด์ฌ ๋์ ๋๋ฆฌ value ๊ธฐ์ค ์ ๋ ฌ (key, lambda) (0) | 2020.11.22 |