✍ 얕은 복사
- 변수는 객체의 메모리 주소를 저장하고, 이를 이용해서 객체를 참조함
- 얕은 복사란, 객체 주소를 복사하는 것으로 객체 자체가 복사되지 않음

class Robot:
def __init__(self,color, height, weight):
self.color = color
self.height = height
self.weight = weight
def printRobotInfo(self):
print(f'color:{self.color}')
print(f'height:{self.height}')
print(f'weight:{self.weight}')
# 얕은 복사
rb1= Robot('red', 200,80)
rb2= rb1 # 얕은 복사
rb1.printRobotInfo()
## color:red
## height:200
## weight:80
rb2.printRobotInfo()
## color:red
## height:200
## weight:80
rb1.color='gray'
rb1.height=250
rb1.weight=100
rb1.printRobotInfo()
## color:gray
## height:250
## weight:100
rb2.printRobotInfo()
## color:gray
## height:250
## weight:100
class TemCls:
def __init__(self,n,s):
self.number=n
self.str= s
def printClsInfo(self):
print(f'self.number:{self.number} ')
print(f'self.str:{self.str}')
tc1=TemCls(10,'Hello')
tc2=tc1
tc1.printClsInfo()
## self.number:10
## elf.str:Hello
tc2.printClsInfo()
## self.number:10
## self.str:Hello
# 얕은 복사
tc2.number=3.14
tc2.str='Bye'
tc1.printClsInfo()
## self.number:3.14
## self.str:Bye
tc2.printClsInfo()
## self.number:3.14
## self.str:Bye
scores = [9,8,5,7,6,10]
scoreCopy=[]
scoreCopy=scores
print(f'id(scores):{id(scores)}') #id 함수는 메모리 주소를 알아보는 함수
## id(scores):2237555615040
print(f'id(scoreCopy): {id(scoreCopy)}') # 얕은 복사이기 때문에 주소값이 같음
## id(scoreCopy): 2237555615040
✍ 깊은 복사
- 깊은 복사란, 객체 자체를 복사하는 것으로, 또 하나의 객체가 만들어짐

class TemCls:
def __init__(self,n,s):
self.number=n
self.str= s
def printClsInfo(self):
print(f'self.number:{self.number} ')
print(f'self.str:{self.str}')
# 깊은복사 방법 1
import copy
tc1=TemCls(10,'Hello')
tc2=copy.copy(tc1)
tc2.number=3.14
tc2.str='Bye'
tc1.printClsInfo()
## self.number:10
## self.str:Hello
tc2.printClsInfo()
## self.number:3.14
## self.str:Bye
import copy
scores = [9,8,5,7,6,10]
scoreCopy=[]
# 깊은복사 방법 2
for s in scores:
scoreCopy.append(s)
print(f'id(scores):{id(scores)}')
## id(scores):2181381104960
print(f'id(scoresCopy): {id(scoreCopy)}') # 깊은 복사이기 때문에 주소값이 다름
## id(scoresCopy): 2181381048320
# 깊은복사 방법 3
scoreCopy.extend(scores)
print(f'id(scores):{id(scores)}')
## id(scores):2838314766144
print(f'id(scoresCopy):{id(scoreCopy)}') # 깊은 복사이기 때문에 주소값이 다름
## id(scoresCopy):2838316217600
# 깊은복사 방법 4
scoresCopy=scores.copy()
print(f'id(scores):{id(scores)}')
## id(scores):1875348049728
print(f'id(scoresCopy):{id(scoreCopy)}') # 깊은 복사이기 때문에 주소값이 다름
## id(scoresCopy):1875348124928
# 깊은복사 방법 5
scoresCopy=scores[:]
print(f'id(scores):{id(scores)}')
## id(scores):2124338908992
print(f'id(scoresCopy):{id(scoreCopy)}') # 깊은 복사이기 때문에 주소값이 다름
## id(scoresCopy):2124338984192
✔ 실습
- 선수의 원본 점수를 이용해서 평균을 출력하고, 최고값과 최저값을 제외한 평균을 출력하는 프로그램 만들기
plaOriSco=[8.7, 9.1, 8.9, 9.0, 7.9, 9.5, 8.8, 8.3]
plaCopSco =plaOriSco.copy()
plaOriSco.sort()
plaCopSco.sort()
plaCopSco.pop(0) # plaCoSco에서 제일 첫번째에 있는 수를 뺀다 (제일 작은 수)
plaCopSco.pop() # plaCoSco에서 제일 마지막에 있는 수를 뺀다 (제일 큰 수)
print(f'plaCopSco.pop:{plaCopSco.pop}')
## plaCopSco.pop:<built-in method pop of list object at 0x0000022FA9F17500>
print(f'plaOriSco:{plaOriSco}')
## plaOriSco:[7.9, 8.3, 8.7, 8.8, 8.9, 9.0, 9.1, 9.5]
print(f'plaCopSco:{plaCopSco}')
## plaCopSco:[8.3, 8.7, 8.8, 8.9, 9.0, 9.1]
oriTot=round(sum(plaOriSco),2)
oriAvg=round((oriTot/len(plaOriSco)),2)
print(f'oriTot:{oriTot}')
## oriTot:70.2
print(f'oriAvg:{oriAvg}')
## oriAvg:8.78
copTot=round(sum(plaCopSco),2)
copAvg=round((copTot/len(plaCopSco)),2)
print(f'Copy Tot:{copTot}')
## Copy Tot:52.8
print(f'Copy Avg:{copAvg}')
## Copy Avg:8.8
print(f'oriAvg-copAvg:{oriAvg-copAvg}')
## oriAvg-copAvg:-0.02000000000000135