๐ ์ด ํฌ์คํ ์์๋ Python์ ๊ฐ์ฒด ์ฐธ์กฐ์ ์ดํด๋ฅผ ํตํด ์์ ๋ณต์ฌ์ ๊น์ ๋ณต์ฌ์ ๋ฐ๋ฅธ ์ฐจ์ด์ ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
๐ฅ ๊ฐ์ฒด์ ์ฐธ์กฐ์ ๋น๊ต์ฐ์ฐ์
๐ฅ ์์๋ณต์ฌ(Copy) ๊น์๋ณต์ฌ(Deep Copy)๋ ๋ฌด์์ผ๊น?
๐ฅ ๊ฐ๋ณํ๊ณผ ๋ถ๋ณํ์ ๊ฐ์ฒด ์ฐธ์กฐ
โ๏ธ x์ ๊ฐ์ฒด๋ฅผ ํ ๋นํ๊ณ y์ x๋ฅผ ํ ๋น์ํค๋ฉด, x์ y๋ ๋ชจ๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
โ๏ธ ์ด์ ์๋ก ๊ฐ์ ๋น๊ตํ๋ฉด True๋ฅผ ๋ฐํํ๊ณ , id๊ฐ๋ ์๋ก ๋์ผํ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
โ๏ธ ์ฆ, x,y๋ ๋ชจ๋ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฅดํค๊ธฐ ๋๋ฌธ์ ์ด ์ค ํ๋๋ฅผ ์์ ํ๋ฉด ๋ชจ๋ ์์ ๋ฉ๋๋ค.
x = {"name": "Jang", "age": 33, "city": "Seoul"} # ๐ x๋ผ๋ ๋ณ์์ ๊ฐ์ฒด๋ฅผ ํ ๋นํฉ๋๋ค. y = x # ๐ y๋ผ๋ ๋ณ์์ x๊ฐ ๊ฐ๋ฅดํค๋ ์ฐธ์กฐ๊ฐ์ ๊ฐ๋ฅดํต๋๋ค. print(x == y) # True print(x is y) # True print(id(x), id(y)) # 140643930504064 140643930504064 print(id(x) == id(y)) # True x["sex"] = "Male" print(x, y) # {'name': 'Jang', 'age': 33, 'city': 'Seoul', 'sex': 'Male'} {'name': 'Jang', 'age': 33, 'city': 'Seoul', 'sex': 'Male'}
โ๏ธ ๊ฐ์ ๊ฐ์ x์ z์ ๊ฐ ๊ฐ ๊ฐ์ฒด๋ฅผ ํ ๋นํ๊ณ ๋น๊ตํ๋ฉด, ๊ฐ์ ๊ฐ์ง๋ง ๋ค๋ฅธ ๋
๋ฆฝ์ ๊ฐ์ฒด์์ ์ ์ ์์ต๋๋ค.
โ๏ธ ๋๋ฑ์ฐ์ฐ์(==)๋ ๊ฐ์ ๋น๊ตํ๊ณ , is๋ ๊ฐ์ ๊ฐ์ฒด์ธ์ง ๊ฐ์ฒด ์ฃผ์๋ฅผ ๋น๊ตํ๋๋ฐ, ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๋น๊ตํ ๋, is๊ฐ ==๋ณด๋ค ์๋๊ฐ ๋น ๋ฆ
๋๋ค.
โ๏ธ ๊ฐ์ฒด ์์ ๋ชจ๋ ์์๋ฅผ ๋น๊ตํ ํ์์์ด ๊ฐ์ ๊ฐ์ฒด์ธ์ง ๋น๊ตํ๊ธฐ ๋๋ฌธ์
๋๋ค.
x = {"name": "Jang", "age": 33, "city": "Seoul", "sex": "Male"} z = {"name": "Jang", "age": 33, "city": "Seoul", "sex": "Male"} print(x, z) # {'name': 'Jang', 'age': 33, 'city': 'Seoul', 'sex': 'Male'} {'name': 'Jang', 'age': 33, 'city': 'Seoul', 'sex': 'Male'} print(x == z) # True print(x is z) # False print(id(x), id(z)) # 140260488281024 140260488281280
โ๏ธ copy๋ ์์ ๋ณต์ฌ๋ผ ๋ถ๋ฆฌ๊ณ , ๊ฐ์ ํ ๋นํ๋ ๊ฒ๊ณผ๋ ๋ค์ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
โ๏ธ ๊ฐ์ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํด์ฃผ๋ list()์ ๋ด์ผ๋ฉด, ์ด๋ฅผ ์์ ๋ณต์ฌ(copy)์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๊ฐ์ง๋ง ๋ค๋ฅธ ๊ฐ์ฒด์
๋๋ค.
โ๏ธ ์ด์ ๊ฐ์ ๋น๊ตํ๋ฉด True๊ฐ ๋์ค์ง๋ง, is๋ก ๊ฐ์ฒด๋ฅผ ๋น๊ตํ๋ฉด False๋ฅผ ๋ฐํํฉ๋๋ค.
data1 = [10, [100, 105], (5, 10, 15)] data2 = data1 # ๐ ํ ๋น data3 = list(data1) # ๐ copy print(data1 == data2) # True print(data1 is data2) # True print(data1 == data3) # True print(data1 is data3) # False
โ๏ธ ๊ฐ์ฒด์ ๊ฐ์ ์ถ๊ฐํ๋ฉด, data1, data2 ๊ฐ์ฒด์์๋ง ๊ฐ์ด ์ถ๊ฐ๋๊ณ , ๊ฐ์ฒด ๋ด ์์ ์ค ๋ฆฌ์คํธ ๋ด์ ๊ฐ์ removeํ๋๋ data1, data2, data3 ๋ชจ๋ ๊ฐ์ด ์ ๊ฑฐ๋ฉ๋๋ค.
โ๏ธ ์ด ์ฐจ์ด๋ ๊ฐ์ฒด data1, data2๋ ๊ฐ์ ๊ฐ์ฒด์ด๊ณ data3๋ ๋ค๋ฅธ ๊ฐ์ฒด์ง๋ง, ๊ฐ์ฒด ๋ด ์์๋ค์ด ๋์ผํ id๊ฐ์ ๊ฐ์ง๊ธฐ ๋๋ฌธ์
๋๋ค.
โ๏ธ ์ฆ, ์์ ๋ณต์ฌ๋ฅผํ๋ฉด ๋ณต์ฌํ ๊ฐ์ฒด ์์ฒด๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ก ๋์ค์ง๋ง ๊ฐ์ฒด ๋ด ์์๋ค์ ํ ๋นํ์ ๋ ์ฒ๋ผ ๊ฐ์ id ๊ฐ์ ๊ฐ๊ณ ์์ต๋๋ค.
data1 = [10, [100, 105], (5, 10, 15)] data2 = data1 # ๐ ํ ๋น data3 = list(data1) # ๐ copy print(data1 == data2) # True print(data1 is data2) # True print(data1 == data3) # True print(data1 is data3) # False # ์์ data1.append(1000) data1[1].remove(105) print(data1) # [10, [100], (5, 10, 15), 1000] print(data2) # [10, [100], (5, 10, 15), 1000] print(data3) # [10, [100], (5, 10, 15)]
โ๏ธ ์ด๋ฒ์๋ ๊ฐ์ฒด ๋ด ๋ฆฌ์คํธ์ ํํ์ ์ ๊ทผํ์ฌ ๊ฐ์ ์ถ๊ฐํด๋ณด๊ฒ ์ต๋๋ค. ์์ ํ๊ธฐ ์ ๊ฐ์ฒด ๋ด ์์์ id๊ฐ์ ํ์ธํด๋ณด๋ฉด ๋ชจ๋ ๋์ผํ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
โ๏ธ ๊ฐ์ฒด ๋ด ๋ฆฌ์คํธ์ ์์ ์ ๋ฐ์์ํค๋ฉด, ๋ชจ๋ ๊ฐ์ id๊ฐ์ ๊ฐ๊ณ ์๊ธฐ ๋๋ฌธ์ ์์ ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ๋จ, ํํ์์๋ ๋ค๋ฅธ ์์์ ๋ณด์
๋๋ค.
โ๏ธ ํํ์ ๋ถ๋ณ์ด๊ธฐ ๋๋ฌธ์ ์์ ์ด ๋ฐ์๋๋ฉด ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. ์ด์ data1[2]๊ณผ data2[2]์ id๊ฐ์ ํจ๊ป ๋ณํ์ง๋ง, data3[2]๋ id๊ฐ์ด ๊ทธ๋๋ก ์
๋๋ค.
โ๏ธ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค๋ ๊ฒ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋นํ๊ณ , ํท๊ฐ๋ฆฌ๊ธฐ ๋๋ฌธ์ ๋ฆฌ์คํธ ์์ ํํ์ ๋ฃ๋ ๊ฒ์ ์ถ์ฒํ์ง ์์ต๋๋ค.
print(id(data1[1]), id(data2[1]), id(data3[1])) # 140677041846656 140677041846656 140677041846656 print(id(data1[2]), id(data2[2]), id(data3[2])) # 140677041885632 140677041885632 140677041885632 data1[1] += [110, 120] data1[2] += (110, 120) print(data1) # [10, [100, 110, 120], (5, 10, 15, 110, 120), 1000] print(data2) # [10, [100, 110, 120], (5, 10, 15, 110, 120), 1000] print(data3) # [10, [100, 110, 120], (5, 10, 15)] print(id(data1[1]), id(data2[1]), id(data3[1])) # 140677041846656 140677041846656 140677041846656 print(id(data1[2]), id(data2[2]), id(data3[2])) # 140677003933712 140677003933712 140677041885632
โ๏ธ ๊น์ ๋ณต์ฌ๋ ๋ง ๊ทธ๋๋ก ๋ฟ๋ฆฌ๊น์ง ๋ณต์ฌํฉ๋๋ค. ์ฆ, ๊ฐ์ฒด ๋ด๋ถ์ ๊ฐ ์์๊น์ง ๋
๋ฆฝ๋ id๊ฐ์ ๊ฐ์ง๋๋ค.
โ๏ธ ์์ ๋ณต์ฌ๋ฅผ ํ์ ๋ ์ด๋ ํ ์ฐจ์ด๋ฅผ ๋ณด์ด๋์ง ์๋ ์ฅ๋ฐ๊ตฌ๋ ์ฝ๋์์ ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
โ๏ธ basket2๋ basket1์ ์์ ๋ณต์ฌํ์๊ณ , basket3๋ basket1์ ๊น์ ๋ณต์ฌํ์์ต๋๋ค.
โ๏ธ ์ด ๊ฒฐ๊ณผ, 3๊ฐ์ ์ธ์คํด์ค๋ ๋ชจ๋ ๋ค๋ฅธ ๋ค๋ฅธ ๊ฐ์ฒด์ง๋ง, ๊ฐ์ฒด ๋ด๋ถ์ products๋ฅผ ์ดํด๋ณด๋ฉด, "basket1._products"๊ณผ "basket2._products"์ด ๊ฐ์ id๋ฅผ ๊ฐ๊ณ ์์ต๋๋ค.
class Basket: def __init__(self, products=None): if products is None: self._products = [] # ๐ ์ํ์ด ์์ ๊ฒฝ์ฐ, else: self._products = list(products) # ๐ ์ํ์ด ์ด๋ฏธ ์๋๋ฐ ์ถ๊ฐ๋ ๊ฒฝ์ฐ, # ์ํ ์ถ๊ฐ def put_prod(self, prod_name): self._products.append(prod_name) # ์ํ ์ ๊ฑฐ def del_prod(self, prod_name): self._products.remove(prod_name) basket1 = Basket(["Apple", "Bag", "TV", "Snack", "Water"]) basket2 = copy.copy(basket1) # ๐ ์์ ๋ณต์ฌ basket3 = copy.deepcopy(basket1) # ๐ ๊น์ ๋ณต์ฌ print(id(basket1), id(basket2), id(basket3)) # 140659652628384 140659652627856 140659652627184 print(id(basket1._products), id(basket2._products), id(basket3._products)) # 140687808135040 140687808135040 140687808003776
โ๏ธ ์ด๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ์ ์ฐธ์กฐํ๊ณ ์๊ธฐ ๋๋ฌธ์ basket1์์ ์์ ์ด ๋ฐ์ํ๋ฉด, basket2์ ์ํ๋ ์์ ๋๋ ์ผ์ด ๋ฐ์ํฉ๋๋ค.
โ๏ธ ์ด์ ๋ณต์ฌํ ๊ฒฐ๊ณผ๊ฐ ๋ด๋ถ์ ์ผ๋ก๋ ๋
๋ฆฝ์ ์ผ๋ก ์ฒ๋ฆฌ๋๊ธธ ์ํ๋ค๋ฉด ๊น์ ๋ณต์ฌ๋ฅผ ํด์ผํฉ๋๋ค.
basket1.put_prod("MacBook") basket2.del_prod("Snack") print(basket1._products) # ['Apple', 'Bag', 'TV', 'Water', 'MacBook'] print(basket2._products) # ['Apple', 'Bag', 'TV', 'Water', 'MacBook'] print(basket3._products) # ['Apple', 'Bag', 'TV', 'Snack', 'Water']
โ๏ธ ์๋ plus ํจ์๋ x,y๋ฅผ parameter๋ก ์ ๋ฌ ๋ฐ์ ๊ทธ ๊ฐ์ ๋ํ ํ x์ ํ ๋นํ์ฌ ๋ฐํํฉ๋๋ค.
โ๏ธ parameter๋ก ๊ฐ๋ณํ๊ณผ ๋ถ๋ณํ์ด ์ ๋ฌ๋ ๋, ์ด๋ค ์ฐจ์ด๊ฐ ๋ฐ์ํ๋์ง ์์๋ณด๊ฒ ์ต๋๋ค.
def plus(x, y): x += y return x
โ๏ธ ๋ถ๋ณํ str๊ณผ tuple์ ์๋ณธ๋ฐ์ดํฐ์ ์์ ์ด ๋ฐ์ํ์ง ์์ต๋๋ค. ์ฆ, parameter๊ฐ ์ ๋ฌ๋๋ค๋ ๊ฒ์ ์ฐธ์กฐ๊ฐ์ ์ ๋ฌ์ํค๋๋ฐ ๋ถ๋ณํ์ด๊ธฐ ๋๋ฌธ์ ์์ ์ด ๋ฐ์๋๋ฉด ์๋ก์ด ๊ฐ์ฒด๊ฐ ์์ฑ๋ฉ๋๋ค. ์ด์ ํจ์ ๋ฐ์์ c์ id๊ฐ๊ณผ ํจ์ ๋ด์์ ๋ฐํ๋๋ c์ id๋ ๋ค๋ฅธ ๊ฐ์ ๋๋ค.
x = 4 y = 8 print(plus(x, y), x, y) # 12 4 8 c = (10, 100) d = (5, 10) print(plus(c, d), c, d) # (10, 100, 5, 10) (10, 100) (5, 10)
โ๏ธ ๊ฐ๋ณํ์ผ ๋๋ ์ ๋ฌ๋๋ parameter๋ ์ฐธ์กฐ๊ฐ์ด ์ ๋ฌ๋ฉ๋๋ค. ๋ค๋ง, ๊ฐ๋ณํ์ผ ๋๋ ํจ์ ์ธ๋ถ์ a์ ๋ฐํ๋๋ a๊ฐ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ฐ๋ฅดํค๊ธฐ ๋๋ฌธ์ ์๋ณธ ๋ฐ์ดํฐ์ ์์ ๋ ๋ฐ์๋ฉ๋๋ค.
โ๏ธ ์ด์ ํจ์ ๋ฐ์์ a์ id๊ฐ๊ณผ ํจ์ ๋ด์์ ๋ฐํ๋๋ b์ id๋ ๊ฐ์ ๊ฐ์
๋๋ค.
def plus(x, y): x += y return x # ๊ฐ๋ณํ์ผ ๋๋ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ฉ๋๋ค. ์ฐธ์กฐ๊ฐ์ parameter๋ก ์ ๋ฌํ๊ธฐ ๋๋ฌธ์ ๋๋ค. # ์๋ณธ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์ด๋ ๋ ๋๋ ๋ฆฌ์คํธ a = [10, 100] b = [5, 10] print(plus(a, b), a, b) # [10, 100, 5, 10] [10, 100, 5, 10] [5, 10]
โ๏ธ ์ด์ ๋ฐ์ดํฐ๋ฅผ parameter๋ก ์ ๋ฌํ ๋, ์๋ณธ์ ์์ ์ด ๋ฐ์๋๋ ๋ฌธ์ ์๋ค๋ฉด ๊ฐ๋ณํ์ธ list๋ฅผ ์ฌ์ฉํ๊ณ , ์๋ณธ์ ์์ ์ด ๋ฐ์๋๋ฉด ์๋ ๋๋ tuple์ ์ฌ์ฉํด์ผํฉ๋๋ค.
โ๏ธ ๋ถ๋ณํ ๋ฐ์ดํฐ ํ์
๋ค(str, bytes, frozenset, tuple...)์ ๋ฐ์ดํฐ๊ฐ ๋ณต์ฌ๋์ง ์๊ณ ๋ฌด์กฐ๊ฑด ์๋ณธ์ ์ฐธ์กฐํ์ฌ ๋ฐํ๋ฉ๋๋ค.
โ๏ธ ์ด์ฐจํผ ๋ถ๋ณํ ํ์
์ ๊ฐ์ ์์ ์ด ๋ฐ์ํ๋ฉด ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ํจ์จ์ฑ์ ์ํด ํ ๋น์ํ๋ ๋ณต์ฌ๋ฅผํ๋ ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
tt1 = (1, 2, 3, 4, 5) tt2 = tuple(tt1) # ๐ ์์ ๋ณต์ฌ tt3 = tt1[:] print(id(tt1), id(tt2), id(tt3)) # 140317351802896 140317351802896 140317351802896 print(tt1 is tt2) # True print(tt1 is tt3) # True
โ๏ธ ์ฌ์ง์ด str, tuple ๋ฑ ๋ถ๋ณํ์ ํจ์จ์ฑ์ ์ํด ๊ฐ์ ๊ฐ์ด๋ฉด ์์ ๋ณ๊ฐ๋ก ์์ฑํด๋ ๊ฐ์ ๊ณณ์ ์ฐธ์กฐํฉ๋๋ค.
tt4 = (10, 20, 30, 40, 50) tt5 = (10, 20, 30, 40, 50) ss1 = "Apple" ss2 = "Apple" print(tt4 is tt5, tt4 == tt5) # True True print(id(tt4), id(tt5)) # 140323132363296 140323132363296 print(ss1 is ss2, ss1 == ss2) # True True print(id(ss1), id(ss2)) # 140323162495920 140323162495920