λ°±μ€μ νλ€κ° νμ΄μ¬μ λ³μλ₯Ό λμ ν λ λ©λͺ¨λ¦¬ μ£Όμκ° μ’ λ€λ₯΄κ² ν λΉλλ κ² κ°μμ
μμ보λ 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 λ©μλλ₯Ό μ¬μ©ν΄μ£Όμ΄μΌ νλ€.
'4οΈβ£ Python > Python μ 리' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Python] μκ³ λ¦¬μ¦ λ¬Έμ νμ΄ μ νμν μ£Όμ ν (sys.setrecursionlimit(), sys.stdin.readline()) (0) | 2022.01.30 |
---|---|
[Python] 리μ€νΈ κ΄λ ¨ ν¨μ μ΄μ 리! (0) | 2021.11.15 |
[Python] μ μΆλ ₯ μ 리 (0) | 2021.11.15 |
λκΈ