glowing713
Frontend-Deep-Dive
glowing713
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (97)
    • Languages (11)
      • JavaScript ๐Ÿ’› (3)
      • Python ๐Ÿ (4)
      • Java โ˜•๏ธ (3)
      • Swift ๐Ÿงก (1)
    • Computer_Science (1)
      • Computer_Network ๐Ÿ•ธ (1)
    • Web_Frontend (4)
      • Vue.js (1)
    • Problem_Solving (76)
    • Server (1)
      • Spring ๐Ÿ€ (1)
    • AI (2)
      • NLP ๐Ÿ—ฃ (1)
      • AI_Math โž— (1)
    • ๊ฐœ๋ฐœํ™˜๊ฒฝ ๊พธ๋ฏธ๊ธฐ โœŒ (1)
    • ์ƒ๊ฐ์ •๋ฆฌ โœ๐Ÿป (1)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ๐Ÿง‘๐Ÿปโ€๐Ÿ’ปGithub

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

  • ์ด๋ถ„ํƒ์ƒ‰
  • Python
  • Algorithm
  • ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
  • ps
  • boostcampaitech
  • binary search
  • BOJ
  • c++
  • 2019 ์นด์นด์˜ค ๊ฐœ๋ฐœ์ž ๊ฒจ์šธ ์ธํ„ด์‹ญ
  • bfs
  • ๋™์ ๊ณ„ํš๋ฒ•
  • DP
  • ์™„์ „ํƒ์ƒ‰
  • mst
  • Java
  • Stack
  • brute-force
  • Baekjoon
  • ์นด์นด์˜ค ๊ธฐ์ถœ

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
glowing713

Frontend-Deep-Dive

[Python] Immutable ๊ฐ์ฒด์™€ Mutable ๊ฐ์ฒด
Languages/Python ๐Ÿ

[Python] Immutable ๊ฐ์ฒด์™€ Mutable ๊ฐ์ฒด

2021. 1. 19. 19:26

 

Everything is object in Python.

 

 


Python ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ

 

๋ถ€์ŠคํŠธ์บ ํ”„ AI Tech 1๊ธฐ์—์„œ ๊ฐ•์˜๋ฅผ ๋“ฃ๋˜ ์ค‘ Python์˜ ๋ณ€์ˆ˜ ํ• ๋‹น๊ณผ ==์™€ is ๋น„๊ต ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•ด ๋ฐฐ์šฐ๊ฒŒ ๋˜์—ˆ๋‹ค.

๋ณ€์ˆ˜์— ๊ฐ’์„ ํ• ๋‹นํ•  ๋•Œ ๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ’์„ ์ „๋‹ฌํ•  ๋•Œ, Python์€ C/C++ ๋˜๋Š” Java์˜ ๋ฐฉ์‹๊ณผ ๋ญ”๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š” ์ ์„ ๊นจ๋‹ซ๊ฒŒ ๋˜์—ˆ๋‹ค.

๊ถ๊ธˆํ•œ ์ ์„ ์ฐพ์•„๋ณด๋‹ค๊ฐ€ ์–ผ๋–จ๊ฒฐ์— Python์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋ฐฉ์‹์— ๋Œ€ํ•ด ๋นก๊ณต์„ ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

 

๋ญ”๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์€ ์•Œ๊ฒ ๋Š”๋ฐ ์ดํ•ด๊ฐ€ ์ž˜ ๋˜์ง€ ์•Š์•„์„œ ํ”ผ์–ด ์„ธ์…˜ ๋•Œ ํŒ€์› ๋ถ„๋“ค๊ณผ ํ•จ๊ป˜ ์ด์•ผ๊ธฐํ•ด๋ณด๊ฒŒ ๋˜์—ˆ๊ณ ,

Python์˜ Mutable ๊ฐ์ฒด์™€ Immutable ๊ฐ์ฒด์— ๋Œ€ํ•ด ๋“ฃ๊ฒŒ ๋˜์—ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ฐœ์ธ ํ•™์Šต ์‹œ๊ฐ„์— ์ถ”๊ฐ€์ ์œผ๋กœ Python์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์— ๋Œ€ํ•ด ์ฐพ์•„๋ณด๋ฉด์„œ ์ƒ๋‹นํžˆ ํฅ๋ฏธ๋กœ์šด ๋‚ด์šฉ๋“ค์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค!๐Ÿฅณ

 

 


 

 

1. Mutable๊ณผ Immutable ํƒ€์ž…

 

 

  • Immutable : ์ˆซ์ž(number), ๋ฌธ์ž์—ด(string), ํŠœํ”Œ(tuple)
  • Mutable : ๋ฆฌ์ŠคํŠธ(list), ๋”•์…”๋„ˆ๋ฆฌ(dictionary), NumPy์˜ ๋ฐฐ์—ด(ndarray)

 

 

  • Immutable ํƒ€์ž…

์•„๋ž˜์˜ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋ณผ ๋•Œ, C/C++๊ณผ ๊ฐ™์€ ์–ธ์–ด๋Š” b = a๊ฐ€ ์‹คํ–‰๋˜๋ฉด ๊ฐ’์„ a์—์„œ b๋กœ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Python์€ Everyting is object ์ •์‹ ์„ ์ง€๋‹ˆ๊ณ  ์žˆ๋‹ค.

๋ญ”๊ฐ€ ๋‹ค๋ฅด๋‹ค.

 

a = 9999
b = a
c = 9999
print(f'initial a({a}): {str(id(a))}')
print(f'initial b({b}): {str(id(b))}')
print(f'initial c({c}): {str(id(c))}')
print('---------------------------------')
b = 10000
print(f'modified a({a}): {str(id(a))}')
print(f'modified b({b}): {str(id(b))}')
c = 123
print(f'modified c({c}): {str(id(c))}')
# ๊ฒฐ๊ณผ
initial a(9999): 140187690856656
initial b(9999): 140187690856656
initial c(9999): 140187690856656
---------------------------------
modified a(9999): 140187690856656
modified b(10000): 140187690856624
modified c(123): 4508199520

 

 

Python์˜ ๊ฐ’ ํ• ๋‹น์€ 9999๋ผ๋Š” int object๋ฅผ ๋งŒ๋“ค๊ณ , ๋ณ€์ˆ˜ a๊ฐ€ ์ด๊ฒƒ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค.

b = a ๋ฌธ์žฅ์ด ์‹คํ–‰๋˜๋ฉด ๋ณ€์ˆ˜ b๋Š” ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ 9999๋ผ๋Š” int object๋ฅผ ๊ทธ๋ƒฅ ๊ฐ€๋ฆฌํ‚ค๊ธฐ๋งŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๋ณ€์ˆ˜์˜ ๊ณ ์œ ๊ฐ’(๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ)์„ ์•Œ๋ ค์ฃผ๋Š” id() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด ์ด๋ฅผ ๋”์šฑ ์ง๊ด€์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์œ„ ์†Œ์Šค์ฝ”๋“œ์— ๋Œ€ํ•œ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด a์˜ id๋Š” 140187690856656๋ผ๋Š” ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค.

์ด์–ด์„œ, a๋กœ๋ถ€ํ„ฐ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋„˜๊ฒจ๋ฐ›์€ b๋„ ๋™์ผํ•œ ๊ฐ’์ธ 140187690856656๋ฅผ id๋กœ ๊ฐ–๋Š”๋‹ค.

c๋Š” ์ดˆ๊ธฐ๊ฐ’์ด 9999๋กœ ๋™์ผํ•œ๋ฐ, id๊ฐ€ 140187690856656์ธ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์„œ๋กœ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์ผ์ง€๋ผ๋„ ๊ฐ™์€ ๊ฐ’์„ ํ• ๋‹น๋ฐ›๋Š”๋‹ค๋ฉด ๊ฐ™์€ int ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋˜๊ณ ,

๊ฐ’์ด ๋ณ€ํ•œ๋‹ค๋ฉด ๋˜ ๋‹ค๋ฅธ ๊ฐ’์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๊ฒƒ์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

Immutable ํƒ€์ž…์ธ ์ˆซ์ž/๋ฌธ์ž์—ด/ํŠœํ”Œ์€ ๋ชจ๋‘ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•œ๋‹ค.

 

 

๐Ÿ“ ์ฐธ๊ณ 

๊ฐ™์€ ๊ฐ’์ด์–ด๋„ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค๋ฅธ ์ฃผ์†Œ๋ฅผ ๊ฐ–๋Š”๋‹ค.

a = 100์ด ์ฒ˜์Œ ์„ ์–ธ๋˜์—ˆ์„ ๋•Œ, 100์˜ ์ฃผ์†Œ๋Š” ๊ทธ๋•Œ๊ทธ๋•Œ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

a = 100
print(id(a))

์‹ค์ œ๋กœ ์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, ๋งค๋ฒˆ ๋‹ค๋ฅธ id ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

 

  • Mutable ํƒ€์ž…
x = [1,2,3]
y = x
y += [4,]

print(x)  # [1,2,3,4]
print(y)  # [1,2,3,4]

 

์œ„์—์„œ ๋‘๋ฒˆ์งธ ์ค„๊นŒ์ง€ ์‹คํ–‰ํ•˜๋ฉด x, y๋Š” ๋ชจ๋‘ [1,2,3]์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค. ์ดํ›„ y๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด x ์—ญ์‹œ๋„ ๋ณ€๊ฒฝ๋˜๊ฒŒ ๋œ๋‹ค.

์ฆ‰, C/C++ ๊ด€์ ์—์„œ ๋ณด๋ฉด ํฌ์ธํ„ฐ ์—ฐ์‚ฐ ๋˜๋Š” ๋ ˆํ”„๋Ÿฐ์Šค ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•œ ๊ฒƒ๊ณผ ์œ ์‚ฌํ•จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์“ฐ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ปจํ…Œ์ด๋„ˆ๋Š” mutable ์ด๋ฏ€๋กœ shallow copy ๊ฐ€ ๋˜๋Š” ๊ฒƒ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

immutable ํƒ€์ž…์€ ์ง์ ‘ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋Š” deep copy๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐ˜๋ฉด, mutable ํƒ€์ž…์€ ๋‚ด๋ถ€์ ์œผ๋กœ shallow copy๋งŒ์„ ์ ์šฉํ•œ๋‹ค.

์ด๋Š” copy.deepcopy()๋ฅผ ํ†ตํ•ด deep copy๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

 

 

 

2. Python์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ „๋‹ฌ

 

  • Immutable ํƒ€์ž…
def foo(a):
    print(f'local a: {a}')  # local a: 100
    print(f'local id: {id(a)}')  # local id: 4411828096
    a += 2
    print(f'local changed a: {a}')  # local changed a: 102
    print(f'local changed id: {id(a)}')  # local changed id: 4411828160


a = 100
print(f'main a: {a}')  # main a: 100
print(f'main id: {id(a)}')  # main id: 4411828096
foo(a)

 

Immutable ํƒ€์ž…์€ ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๊ฐ’์„ ๋„˜๊ธธ ๋•Œ, Call by value์ฒ˜๋Ÿผ ์ž‘์šฉํ•œ๋‹ค.

foo ํ•จ์ˆ˜์˜ a์™€ ๋ฐ”๊นฅ์˜ a๋Š” ์ด๋ฆ„๋„ ๊ฐ™๊ณ , ๊ฐ™์€ 100์ด๋ผ๋Š” int object๋ฅผ ๊ฐ€๋ฆฌํ‚ค์ง€๋งŒ foo ํ•จ์ˆ˜์—์„œ ์ˆ˜์ •ํ•˜๋ฉด์„œ ๋‹ค๋ฅธ int object๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค. ์ด์ „์— ๋„˜๊ฒจ๋ฐ›์€ a์—๋Š” ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.

๋งˆ์น˜ C/C++์—์„œ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋„˜๊ฒจ์ค„ ๋•Œ Call by value์ฒ˜๋Ÿผ ๋ง์ด๋‹ค.

 

 

  • Mutable ํƒ€์ž…
def foo(a):
    print(f'local a: {a}')  # local a: []
    print(f'local id: {id(a)}')  # local id: 140404441297376
    a.append(1)
    print(f'local changed a: {a}')  # local changed a: [1]
    print(f'local changed id: {id(a)}')  # local changed id: 140404441297376


a = []
print(f'main a: {a}')  # main a: []
print(f'main id: {id(a)}')  # main id: 140404441297376
foo(a)
print(f'main changed a: {a}')  # main changed a: [1]
print(f'main changed id: {id(a)}')  # main changed id: 140404441297376

 

Mutable ํƒ€์ž…์€ ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๊ฐ’์„ ๋„˜๊ธธ ๋•Œ, Call by reference์ฒ˜๋Ÿผ ์ž‘์šฉํ•œ๋‹ค.

mutableํ•˜๋ฏ€๋กœ ๋™์ผํ•œ list object์— ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋˜๊ณ , ์ด๋Š” ๋ฐ”๊นฅ์˜ list์ธ a์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜๋‹ค.

 

 

 

 

๋งˆ๋ฌด๋ฆฌ

Mutableํ•œ์ง€, Immutable ํ•œ ์ง€์— ๋”ฐ๋ผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ž‘์šฉํ•˜๋Š” ๋ฐฉ์‹์ด ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

Python์„ ์ข€ ๋” ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ ๋งŒํผ, ์•ž์œผ๋กœ ํŒŒ์ด์ฌ์œผ๋กœ ์ฝ”๋”ฉํ•  ๋•Œ ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

๋งŒ---์กฑ๐Ÿ‘

 

 

 

 

 

 

 

- ์ฐธ์กฐ

1. ๊ณตํ•™์ž๋ฅผ ์œ„ํ•œ Python 2.1.7 mutable vs immutable(https://wikidocs.net/32277)

2. python ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ(memory allocation)(https://leemoney93.tistory.com/25)

3. Python์˜ Call by assignment ๊ฐœ๋…(https://jins-dev.tistory.com/entry/Python-%EC%9D%98-Call-by-assignment-%EC%9D%98-%EA%B0%9C%EB%85%90)

์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋ณ€๊ฒฝ๊ธˆ์ง€ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'Languages > Python ๐Ÿ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Python] python์˜ ๋ณ€์ˆ˜ ์Šค์ฝ”ํ”„  (0) 2021.12.02
[Python] Handling (Exception, File, Directory, Data)  (0) 2021.01.22
[Python] Python์˜ ์ž๋ฃŒ๊ตฌ์กฐ  (0) 2021.01.21
    'Languages/Python ๐Ÿ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [Python] python์˜ ๋ณ€์ˆ˜ ์Šค์ฝ”ํ”„
    • [Python] Handling (Exception, File, Directory, Data)
    • [Python] Python์˜ ์ž๋ฃŒ๊ตฌ์กฐ
    glowing713
    glowing713

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”