๐Ÿ‘จโ€๐Ÿ’ป Seungineer's GitHub Contribution

๐Ÿงญ KAIST JUNGLE/Algorithm

[SW ์ •๊ธ€ 16์ผ์ฐจ] list๋ฅผ ํ• ๋‹น ํ›„ ์ˆ˜์ •ํ–ˆ๋Š”๋ฐ, ์›๋ณธ์ด ๋ฐ”๋€Œ์–ด์š” (#mutablle๊ฐ์ฒด #python)

seungineer = seungwoo + engineer 2024. 3. 26. 21:43

python์„ ํ†ตํ•ด ํ•œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ž์ฃผ ์žˆ๋‹ค. ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด (์ƒˆ๋กœ์šด ๋ณ€์ˆ˜์—)๋ณต์‚ฌ๋˜์—ˆ๋‹ค๊ณ  ์ฐฉ๊ฐํ•  ๋•Œ, ์˜ˆ์ƒ๊ณผ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋  ๊ฒƒ์ด๋‹ค.

 

์•„๋ž˜ ์ผ€์ด์Šค๋Š” ์ฐฉ๊ฐํ•˜๊ฒŒ ๋˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค์ด๋‹ค.

list1 = [1, 2, 3, 4]
list2 = list1 # list1์„ list2์— '๋ณต์‚ฌ'

# list2 ์ˆ˜์ •
list2[1] = 100
list2.append(5)

# list2 ์ถœ๋ ฅ
print(list2) # [1, 100, 3, 4, 5]

# list1์€ ๊ทธ๋Œ€๋กœ๊ฒ ์ง€?
print(list1) # [1, 100, 3, 4, 5] ๐Ÿค”

 

list2๋ฅผ ์ˆ˜์ •(์กฐ์ž‘)ํ–ˆ๋Š”๋ฐ, list1์ด ๋™์ผํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค. ์˜๋„ํ•œ ๊ฒƒ์ด ์•„๋‹ ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ์ž‘๋™ ๋˜๋Š” ์ด์œ ์— ๋Œ€ํ•ด ์•Œ์•„๋ณธ๋‹ค.


python์—์„œ list์™€ ๊ฐ™์€ 'mutable(๊ฐ€๋ณ€)' ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃฐ ๋•Œ, ๋‹จ์ˆœ ํ• ๋‹น ์—ฐ์‚ฐ('=')์„ ์‚ฌ์šฉํ•˜๋ฉด ์›๋ณธ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ๋งŒ์„ ์ƒ์„ฑํ•œ๋‹ค. ์›๋ณธ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ผ๊ณ  ํ•˜๋ฉด, ์œ„ ์ฝ”๋“œ์—์„œ [1, 2, 3, 4] ๋ผ๋Š” ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋‹ด๊ฒจ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰, list1์ด [1, ..., 4] ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ์œ„์น˜ ์ •๋ณด(๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ)๋ฅผ list2์—๊ฒŒ ์ฃผ๋Š” ๊ฒƒ(!).

 

์‚ฌ์‹ค์€ ์ด๋Ÿฐ ๊ตฌ์กฐ์˜€๋˜ ๊ฒƒ์ด๋‹ค. ๋ฉ”๋ชจ๋ฆฌ์ƒ์˜ ๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋‹ค.

 

'mutable'ํ•œ ๊ฐ์ฒด(list, dict, ndarray(NumPy์˜ ๋ฐฐ์—ด))๋ฅผ ํ• ๋‹น ์—ฐ์‚ฐํ•  ๋•Œ ์ด๋ฅผ ์ˆ™์ง€ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์ž! list1๋“  list2๋“  ๊ฐ™์€ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ์— ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋งŒ์•ฝ, ์ฐธ์กฐํ•˜๋Š” ์ฃผ์†Œ๊ฐ€ ์•„๋‹Œ[1, ..., 4]์™€ ๊ฐ™์€ ๋ฆฌ์ŠคํŠธ ์ž์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ํ•  ์ˆ˜ ์žˆ์„๊นŒ? 'shallow copy'์™€ 'deep copy'๋ฅผ ์•Œ์•„๋ณด์ž.

 

1. Shallow Copy

๊ฐ์ฒด์˜ ์ฒซ ๋ฒˆ์งธ ๋ ˆ๋ฒจ๋งŒ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋ ˆ๋ฒจ์ด๋ผ๊ณ  ํ•˜๋ฉด, [1, ..., 4]์ธ ๋ฆฌ์ŠคํŠธ์—์„œ ๊ฐ€์žฅ ๋ฐ”๊นฅ์˜ '๊ป๋ฐ๊ธฐ'๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ๋ฆฌ์ŠคํŠธ์˜ ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ๋งŒ ๋ณต์ œ๋˜๊ณ , ๋ฆฌ์ŠคํŠธ ๋‚ด๋ถ€์— ๋˜ ๋‹ค๋ฅธ mutable ๊ฐ์ฒด๊ฐ€ ์žˆ๋‹ค๋ฉด ์ด๋Š” '์ฐธ์กฐ ์ฃผ์†Œ'๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ.

 

Shallow copy๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ. ์ƒˆ๋กญ๊ฒŒ ๋ณต์‚ฌ๋œ ๋ฆฌ์ŠคํŠธ ์•ˆ์—์„œ๋„ mutable ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฃผ์†Œ๋Š” ๊ทธ๋Œ€๋กœ ์ฐธ์กฐํ•œ๋‹ค.

 

'๊ป๋ฐ๊ธฐ'๋Š” ๊ฐ์ฒด๊ฐ€ ์™„์ „ํžˆ ๋ถ„๋ฆฌ๊ฐ€ ๋˜์—ˆ๋‹ค. ๋‹ค๋งŒ, '๊ป๋ฐ๊ธฐ' ์•ˆ์— ์žˆ๋Š” mutable ๊ฐ์ฒด๋Š” ์—ฌ์ „ํžˆ ๋™์‹œ์— ๊ฐ™์€ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐ ์ค‘์ด๋‹ค. ์ด ๊ฒฝ์šฐ list2 ๋‚ด๋ถ€์— ์ค‘์ฒฉ๋œ [1, 2, 3]์„ ์ˆ˜์ •(์กฐ์ž‘)ํ•  ๊ฒฝ์šฐ list1 ๋‚ด๋ถ€์—๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋œ๋‹ค. ์ตœ์ƒ์œ„ ๊ฐ์ฒด์˜ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค ๋•Œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ถ”๊ฐ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ์— ํ• ๋‹น ์—ฐ์‚ฐ๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋งŽ๋‹ค. '๊ป๋ฐ๊ธฐ' ์•ˆ์— ์žˆ๋Š” ๊ฒƒ๋„ ์™„์ „ํžˆ ์ƒˆ๋กญ๊ฒŒ ๋ณต์ œํ•  ๋•Œ๋Š” 'Deep copy'๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

2. Deep copy

์ค‘์ฒฉ๋œ list, dictionary ํ˜•๋„ ์™„์ „ํžˆ ๋…๋ฆฝ์ ์œผ๋กœ ๋ณต์ œํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ shallow copy์—์„œ ๊ฐ™์€ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๋˜ ๋‚ด๋ถ€ list๋„ ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค. ์›๋ณธ ๊ฐ์ฒด, ์ค‘์ฒฉ๋œ ๊ฐ์ฒด ๋ชจ๋‘์— ๋Œ€ํ•œ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค๊ธฐ์— shallow copy๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ํฌ๋‹ค. ๋ณต์‚ฌ๋ณธ์ด๋“  ์›๋ณธ์ด๋“  ์ˆ˜์ •ํ•ด๋„ ๊ฐ ๊ฐ์ฒด์— ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค. 


3. ์˜ˆ์ œ ์ฝ”๋“œ

import copy

original_list = [[1, 2, 3], [4, 5, 6]]

# ํ• ๋‹น ์—ฐ์‚ฐ
assigned_list = original_list

# Shallow Copy
shallow_copied_list = original_list.copy()

# Deep Copy
deep_copied_list = copy.deepcopy(original_list)

# ์›๋ณธ ๊ฐ์ฒด ์กฐ์ž‘
original_list[0][0] = 100

print("Original:", original_list)
print("Assigned:", assigned_list)
print("Shallow Copied:", shallow_copied_list)
print("Deep Copied:", deep_copied_list)

# ์ถœ๋ ฅ ๊ฒฐ๊ณผ
# Original: [[100, 2, 3], [4, 5, 6]]
# Assigned: [[100, 2, 3], [4, 5, 6]]
# Shallow Copied: [[100, 2, 3], [4, 5, 6]]
# Deep Copied: [[1, 2, 3], [4, 5, 6]]

 

์›๋ณธ ๊ฐ์ฒด์˜ ์ค‘์ฒฉ๋œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์กฐ์ž‘ํ•˜์ž 'shallow copy'ํ•œ ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ ํ•จ๊ป˜ ์กฐ์ž‘๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋ฉด์— 'deep copy'ํ•œ ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ ๋…๋ฆฝ์ ์ด๋‹ค. Shallow copy๋ฅผ ํ†ตํ•ด '๊ป๋ฐ๊ธฐ'๋Š” ์ƒˆ๋กญ๊ฒŒ ํ• ๋‹นํ–ˆ์ง€๋งŒ, ๋‚ด๋ถ€ ๋ฆฌ์ŠคํŠธ์˜ ์ฐธ์กฐ ์ฃผ์†Œ๋Š” ์›๋ณธ ๊ฐ์ฒด์™€ ๋™์ผํ•จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.