ํ์ด์ฌ์ ๊ฐ์ฒด๋จ์๋ก ๋ฉ๋ชจ๋ฆฌ ์์์ ์ ๋ณด๋ฅผ ๊ด๋ฆฌ
๊ฐ์ฒด์๋ ๊ฐ(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) ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํด
๋ถ๋ณ ๊ฐ์ฒด๋ ๊ฐ์ฒด ์์ฑ ์ดํ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ 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
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
๋ํ ๊ฐ์ด ๋ณ๊ฒฝ๋จ- ์์:
a = 'a'
b = a
print(b) # 'a'
b = "abcde"
print(a) # 'a'
a
๋ฅผ ์ฐธ์กฐํ ๋ณ์ b
์ ์๋ก์ด ๊ฐ์ ์ฌํ ๋น--> ๋ฐ๋ผ์ ์์ ๋ณต์ฌ(shallow copy) ์ ๊น์ ๋ณต์ฌ(deep 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]
์ญ์ ์ฐธ์กฐํ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ๊ฐ์ด ๋์ผํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ด ๋ณ๊ฒฝ๋จ
๋ณตํฉ๊ฐ์ฒด(๊ป๋ฐ๊ธฐ)๋ง ๋ณต์ฌํ๋ ๊ฒ์ด ์๋ ๋ด๋ถ ๊ฐ์ฒด(๊ป๋ฐ๊ธฐ ์ ๋ด์ฉ๋ฌผ) ๊น์ง ๋ณ๊ฒฝ๋๋ฉด ์ฒ์ ๊ฐ์ฒด์ ๋ณต์ฌ๋ ๊ฐ์ฒด๊ฐ ์ํฅ์ ๋ฐ์ ์ผ์ด ์์
ํ์ด์ฌ ๋ด์ฅ๋ชจ๋ 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/
๊ป๋ฐ๊ธฐ๋ง ๋ณต์ฌํ๊ธฐ๋๋ฌธ์ ๋ด์ฉ๋ฌผ์ ๋ณต์ฌํ์ง ๋ชปํ๋ ๊ฒ์ ์์ ๋ณต์ฌ,
๊ป๋ฐ๊ธฐ์ ๋ด์ฉ๋ฌผ ๋ชจ๋ ๋ณต์ฌํ๋ ๊ฒ์ ๊น์ ๋ณต์ฌ ๋ผ๊ณ ๋ณด๋ฉด ๋จ