๐Ÿ“’ Python ๊ฐ€๋ณ€ ๊ฐ์ฒด์™€ ๋ถˆ๋ณ€ ๊ฐ์ฒด

TKยท2021๋…„ 1์›” 23์ผ
1
post-thumbnail

๐Ÿ“Œ Python์˜ ๊ฐ์ฒด(Object)

  • ํŒŒ์ด์ฌ์€ ๊ฐ์ฒด๋‹จ์œ„๋กœ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์—์„œ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌ

  • ๊ฐ์ฒด์—๋Š” ๊ฐ’(value), ์œ ํ˜•(type), ์ •์ฒด์„ฑ(identity) 3๊ฐ€์ง€ ํŠน์„ฑ์ด ์กด์žฌ

    ๊ฐ์ฒด์˜ ํŠน์„ฑ
    value๋ฉ”๋ชจ๋ฆฌ์— ๊ธฐ๋ก๋œ ๋‚ด์šฉ, ๊ฐ€๋ณ€๊ฐ์ฒด๋Š” ๊ฐ’์ด ๋ณ€ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ถˆ๋ณ€๊ฐ์ฒด๋Š” ๋ณ€ํ•  ์ˆ˜ ์—†์Œ
    type๋ฐ์ดํ„ฐ์˜ ์ข…๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, type() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด์˜ ์œ ํ˜•์„ ์•Œ ์ˆ˜ ์žˆ์Œ
    Identity๊ฐ๊ฐ์˜ ๊ฐ์ฒด๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ๊ณ ์œ ๋ฒˆํ˜ธ(=๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ์œ„์น˜ํ•œ ์ฃผ์†Œ ๊ฐ’) ,id() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ณ ์œ  id ๊ฐ’ ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅ

์˜ˆ์‹œ:

coding = 2021

coding_id = id(coding)  # coding_id : 65236640
  • coding ์ด๋ผ๋Š” ๋ณ€์ˆ˜๋Š” 2021 ์ด๋ผ๋Š” object๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์—ญํ• 

  • ์ด๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์กด์žฌํ•˜๋Š” ๊ฐ๊ฐ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Œ

  • ๋งŒ์•ฝ coding = '2021'์ด ๋  ๊ฒฝ์šฐ, coding ๋ณ€์ˆ˜๋Š”'2021' ๋ฌธ์ž์—ด(string) ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ด


๐Ÿ“Œ Python์˜ ๊ฐ€๋ณ€ ๊ฐ์ฒด์™€ ๋ถˆ๋ณ€ ๊ฐ์ฒด

๋ถˆ๋ณ€ ๊ฐ์ฒด๋Š” ๊ฐ์ฒด ์ƒ์„ฑ ์ดํ›„ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” object๋ฅผ ์˜๋ฏธํ•˜๊ณ , ๋ฐ˜๋Œ€๋กœ ๊ฐ€๋ณ€ ๊ฐ์ฒด๋Š” ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” object๋ฅผ ์˜๋ฏธ

๋ฐ์ดํ„ฐ ํƒ€์ž…
๊ฐ€๋ณ€(mutable) ๊ฐ์ฒด list, set, dict
๋ถˆ๋ณ€(immutable) ๊ฐ์ฒด int, float, bool, tuple, str, frozenset

๊ฐ€๋ณ€ ๊ฐ์ฒด

- ์˜ˆ์‹œ :

a = [1, 2, 3] # list type
b = {1, 2, 3} # set type

print(id(a)) # 42461224
print(id(b)) # 42408840

a[0] = 10 # ์ฒซ๋ฒˆ์งธ ์›์†Œ ๊ฐ’ ๋ณ€๊ฒฝ
b |= {4, 5, 6} # |๋Š” or ์—ฐ์‚ฐ (ํ•ฉ์ง‘ํ•ฉ)

print(id(a)) # 42461224
print(id(b)) # 42408840
  • ์˜ˆ์‹œ์ฒ˜๋Ÿผ list์™€ set์€ ๊ฐ€๋ณ€ ๊ฐ์ฒด๋Š” ๊ฐ์ฒด์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Œ
  • a์™€ b ์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ๋‘ ๊ฐ์ฒด๋Š” ๋ชจ๋‘ ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— id๊ฐ’์€ ๋ณ€ํ•˜์ง€ ์•Š์Œ

๋ถˆ๋ณ€ ๊ฐ์ฒด

- ์˜ˆ์‹œ:

c = 'abc'

id(c)
Out[3]: 5297632

c[0] = 'd'
Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\envs\py38_32\lib\site-packages\IPython\core\interactiveshell.py", line 3418, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-4-68547969971d>", line 1, in <module>
    c[0] = 'd'
TypeError: 'str' object does not support item assignment

c = 'hello'

id(c)
Out[6]: 45782848

ํŒŒ์ด์ฌ ์ฝ˜์†”์—์„œ ํ…Œ์ŠคํŠธ ํ•ด ๋ณธ ๊ฒฐ๊ณผ,

  • ๋ถˆ๋ณ€ ๊ฐ์ฒด์ธ str ๋ณ€์ˆ˜c์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•จ

  • ํ•˜์ง€๋งŒ, ๋ณ€์ˆ˜ c์— ๋‹ค๋ฅธ ์ƒˆ๋กœ์šด str ๊ฐ’ hello๋ฅผ ํ• ๋‹นํ•˜๋ฉด id ๊ฐ’์ด ๋ณ€๊ฒฝ๋จ
    --> ์ด๋Š” ๋ณ€์ˆ˜์— ์ƒˆ๋กœ์šด ๊ฐ’์„ ์•„์˜ˆ ์žฌํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋ณ€, ๋ถˆ๋ณ€ ๊ฐ์ฒด์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹˜
    (list์™€ set ๋ณ€์ˆ˜ ๋˜ํ•œ ๊ฐ’์„ ์žฌํ• ๋‹นํ•ด์ฃผ๋ฉด id ๊ฐ’์ด ๋ณ€๊ฒฝ๋จ)

๐Ÿ“Œ ๋‹จ์ˆœ๋ณต์‚ฌ

- ์˜ˆ์‹œ:

a = [1, 2, 3, 4]
b = a     # ์–•์€ ๋ณต์‚ฌ (shallow copy)
print(b)    # [1, 2, 3, 4]

b[2] = 30   # b์˜ 3๋ฒˆ์งธ item ๊ฐ’ ๋ณ€๊ฒฝ
print(b)    # [1, 2, 100, 4]
print(a)    # [1, 2, 100, 4]
  • a์™€ b๋Š” ๋™์ผํ•œ list ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐ
  • ๋™์ผํ•œ ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— b ๋ฅผ ๋ณ€๊ฒฝํ•ด๋„ a ๋˜ํ•œ ๊ฐ’์ด ๋ณ€๊ฒฝ๋จ

ํ•˜์ง€๋งŒ,

  • ์œ„ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ๋ณต์‚ฌ๋œ ์ฐธ์กฐ ๋ณ€์ˆ˜๋ฅผ ์ˆ˜์ •ํ–ˆ์„๋•Œ, ์ฒ˜์Œ์— ํ• ๋‹นํ•œ ์ฐธ์กฐ ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋˜‘๊ฐ™์ด ์ˆ˜์ •๋˜๋Š” ๊ฒƒ์€ list์™€ ๊ฐ™์€ mutable ํ•œ ๊ฐ์ฒด์ผ ๋•Œ๋งŒ ํ•ด๋‹นํ•จ
  • int, str, tuple ๊ณผ ๊ฐ™์€ immutable ํ•œ ๊ฐ์ฒด์ผ๋•Œ๋Š” ํ•ด๋‹น๋˜์ง€ ์•Š์Œ

- ์˜ˆ์‹œ:

a = 'a'
b = a
print(b) # 'a'

b = "abcde"
print(a) # 'a'
  • a๋ฅผ ์ฐธ์กฐํ•œ ๋ณ€์ˆ˜ b์— ์ƒˆ๋กœ์šด ๊ฐ’์„ ์žฌํ• ๋‹น
  • ์ด๋Š” ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์žฌํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ž„
  • ์• ์ดˆ์— str ์ž๋ฃŒํ˜•์€ immutable ํ•œ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€๊ฒฝ์ด ์•ˆ๋จ

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์ ์€,

  • ์šฐ๋ฆฌ๊ฐ€ immutable ํ•œ str ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•  ๋–„๋Š” error ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‰ฝ๊ฒŒ ์•Œ์•„์ฐจ๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ
  • mutable ํ•œ ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ๋Š” error ๋„ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ , ์–•์€๋ณต์‚ฌ(shallow copy) ์— ๋Œ€ํ•œ ์ดํ•ด ์—†์ด ๊ฐ’์„ ๋ณต์‚ฌํ–ˆ๋‹ค๊ฐ€๋Š” ์ฐธ์กฐ ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋งˆ๊ตฌ ๋ณ€ํ•œ๋‹ค๋Š” ๋“ฑ ์›ํ•˜์ง€ ์•Š๋Š” ์ƒํ™ฉ์„ ๋งˆ์ฃผํ•  ์ˆ˜ ์žˆ์Œ

--> ๋”ฐ๋ผ์„œ ์–•์€ ๋ณต์‚ฌ(shallow copy) ์™€ ๊นŠ์€ ๋ณต์‚ฌ(deep copy) ์— ๋Œ€ํ•œ ์ดํ•ด ํ•„์š”

๐Ÿ“Œ ์–•์€ ๋ณต์‚ฌ(shallow copy)

- ์˜ˆ์‹œ:

import copy

a = [1, [2, 3, 4]]
b = copy.copy(a)    # shallow copy
print(b)    # [1, [2, 3, 4]] 

b[0] = 10
print(b)    # [10, [2, 3, 4]]
print(a)    # [1, [2, 3, 4]], shallow copy๋กœ ์ƒˆ๋กœ ์ƒ์„ฑ๋œ b์˜ list๊ฐ’๊ณผ๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด

c = copy.copy(a)
c[1].append(5)    # list์˜ ๋‘๋ฒˆ์งธ ์š”์†Œ์— 5 ์ถ”๊ฐ€
print(c)    # [1, [2, 3, 4, 5]]
print(a)    # [1, [2, 3, 4, 5]]
  • ์–•์€ ๋ณต์‚ฌ์™€ ๋‹จ์ˆœ ๋ณต์‚ฌ์˜ ์ฐจ์ด์  : ์–•์€ ๋ณต์‚ฌ๋Š” list๋Š” ๋ณ„๋„๋กœ ์ƒ์„ฑํ•˜์ง€๋งŒ, ๋‘ ๋ณต์‚ฌ ๋ชจ๋‘ ๊ทธ ์•ˆ์— ๋“ค์–ด๊ฐ€๋Š” ๋‚ด์šฉ์€ ์›๋ž˜์™€ ๊ฐ™์€ ๊ฐ์ฒด (๋‚ด๋ถ€ ๊ฐ์ฒด์˜ ๊ฐ’์€ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•˜๊ณ  ๊ป๋ฐ๊ธฐ๋งŒ ๋ณต์‚ฌํ•œ๋‹ค๊ณ  ๋ณด๋ฉด ๋จ)

  • ์˜ˆ์‹œ์—์„œ b์˜ ์ฒซ๋ฒˆ์งธ ์š”์†Œ(int)๋ฅผ ๋ณ€๊ฒฝํ•˜์˜€์„๋•Œ a ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ๊ฒƒ์€ ๊ทธ ์š”์†Œ๊ฐ€ immutable ํ•˜๊ธฐ ๋•Œ๋ฌธ

  • immutable ํ•˜๋‹ค๋Š” ๊ฒƒ์€, ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ์žˆ๋Š” ์š”์†Œ์˜ ๊ฐ’์ด ์ˆ˜์ •๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ(์ˆ˜์ • ํ•  ์ˆ˜๋„ ์—†์Œ) ์•„์˜ˆ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์—์„œ ์ƒˆ๋กœ์šด ๊ฐ’์„ ์ฐธ์กฐํ•˜๊ฒŒ ๋จ
    --> ๋”ฐ๋ผ์„œ b ์—์„œ ๋ณ€๊ฒฝ๋œ ์š”์†Œ๊ฐ€ a ์—๋Š” ๋ฐ˜์˜๋˜์–ด ์žˆ์ง€ ์•Š์Œ

  • ํ•˜์ง€๋งŒ c ์˜ ๊ฒฝ์šฐ ๋‘ ๋ฒˆ์งธ ์š”์†Œ๊ฐ€ list, ์ฆ‰ mutable ํ•œ ์š”์†Œ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ฐ’์„ ๋ณ€๊ฒฝํ•œ๋‹ค๋Š” ๊ฒƒ์€ ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ์žˆ๋Š” ์š”์†Œ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ, a[1] ์—ญ์‹œ ์ฐธ์กฐํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ๊ฐ’์ด ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์ด ๋ณ€๊ฒฝ๋จ

๐Ÿ“Œ ๊นŠ์€ ๋ณต์‚ฌ(deep copy)

๋ณตํ•ฉ๊ฐ์ฒด(๊ป๋ฐ๊ธฐ)๋งŒ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋‚ด๋ถ€ ๊ฐ์ฒด(๊ป๋ฐ๊ธฐ ์† ๋‚ด์šฉ๋ฌผ) ๊นŒ์ง€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ฒ˜์Œ ๊ฐ์ฒด์™€ ๋ณต์‚ฌ๋œ ๊ฐ์ฒด๊ฐ€ ์˜ํ–ฅ์„ ๋ฐ›์„ ์ผ์ด ์—†์Œ

ํŒŒ์ด์ฌ ๋‚ด์žฅ๋ชจ๋“ˆ copy.deepcopy๋Š” ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•จ

import copy

a = [1, [1, 2, 3]]
b = copy.deepcopy(a)    # deep copy
print(b)    # [1, [1, 2, 3]]

b[0] = 100
b[1].append(4)
print(b)    # [100, [1, 2, 3, 4]]
print(a)    # [1, [1, 2, 3]]
  • b์˜ ๋ณ€๊ฒฝ๋œ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ(immutable)๊ณผ ๋‘ ๋ฒˆ์งธ ์š”์†Œ(mutable) ๋ชจ๋‘ a์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Œ, ๋‚ด๋ถ€ ๊ฐ์ฒด๋“ค๋„ ์žฌ๊ท€์ ์œผ๋กœ ๋ณต์‚ฌ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ

๊ฒฐ๋ก ์ ์œผ๋กœ

๋‹จ์ˆœ๋ณต์ œ๋Š” ์™„์ „ํžˆ ๋™์ผํ•œ ๊ฐ์ฒด,
์–•์€๋ณต์‚ฌ(shallow copy)๋Š” ๋ณตํ•ฉ๊ฐ์ฒด๋งŒ ๋ณต์‚ฌ, ๋‚ด๋ถ€๊ฐ์ฒด๋Š” ๋™์ผ
๊นŠ์€๋ณต์‚ฌ(deep copy)๋Š” ๋ณตํ•ฉ๊ฐ์ฒด ๋ฐ ๋‚ด๋ถ€๊ฐ์ฒด ๋˜ํ•œ ์žฌ๊ท€์ ์œผ๋กœ ๋ณต์‚ฌ

์ฐธ๊ณ  ํŽ˜์ด์ง€:
https://wikidocs.net/16038
https://blueshw.github.io/2016/01/20/shallow-copy-deep-copy/

๊ป๋ฐ๊ธฐ๋งŒ ๋ณต์‚ฌํ•˜๊ธฐ๋•Œ๋ฌธ์— ๋‚ด์šฉ๋ฌผ์„ ๋ณต์‚ฌํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์€ ์–•์€ ๋ณต์‚ฌ,
๊ป๋ฐ๊ธฐ์™€ ๋‚ด์šฉ๋ฌผ ๋ชจ๋‘ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์€ ๊นŠ์€ ๋ณต์‚ฌ ๋ผ๊ณ  ๋ณด๋ฉด ๋จ

profile
Backend Developer

0๊ฐœ์˜ ๋Œ“๊ธ€