Python

์–•์€ ๋ณต์‚ฌ(shallow copy)์™€ ๊นŠ์€ ๋ณต์‚ฌ(deep copy) + 2์ฐจ์› ๋ฐฐ์—ด ์„ ์–ธ

minzeros 2022. 5. 31. 17:26

๐Ÿ“Œ 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์ฐจ์› ๋ฐฐ์—ด์—์„œ ํŠน์ • ์นธ์˜ ๊ฐ’์„ ๋ฐ”๊พธ๋ฉด ํ•ด๋‹น ์—ด์˜ ๋ชจ๋“  ๊ฐ’์ด ๋ฐ”๋€Œ๊ฒŒ ๋œ๋‹ค.