[Python] 중급6. 깊은 복사와 얕은 복사

HyunJin·2024년 5월 30일

✍ 얕은 복사

  • 변수는 객체의 메모리 주소를 저장하고, 이를 이용해서 객체를 참조함
  • 얕은 복사란, 객체 주소를 복사하는 것으로 객체 자체가 복사되지 않음
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
profile
데이터 분석가 준비생

0개의 댓글