๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
4๏ธโƒฃ Python/Python ์ •๋ฆฌ

[Python] ์–•์€ ๋ณต์‚ฌ vs ๊นŠ์€ ๋ณต์‚ฌ (feat. mutable, immutable ๊ฐ์ฒด)

by seolhee2750 2022. 1. 30.

๋ฐฑ์ค€์„ ํ’€๋‹ค๊ฐ€ ํŒŒ์ด์ฌ์€ ๋ณ€์ˆ˜๋ฅผ ๋Œ€์ž…ํ•  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ์ข€ ๋‹ค๋ฅด๊ฒŒ ํ• ๋‹น๋˜๋Š” ๊ฒƒ ๊ฐ™์•„์„œ

์•Œ์•„๋ณด๋‹ˆ 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 ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

๋Œ“๊ธ€