기본 콘텐츠로 건너뛰기

python3 변수를 복사하기

>>> for j in range(10):
...     random.seed()
...     for i in range(6):
...         num.append(random.randint(0,9))
...     num_col.append(num)
...     num.clear()
...
>>> num_col
[[], [], [], [], [], [], [], [], [], []]

위의 소스는 랜덤값 6개를 만들어 리스트를 만들고 그 값을 num_col 리스트에 추가 합니다. 하지만 결과는 아무값도 들어가지 않습니다. 왜냐 하면 그 아래 num.clear() 때문입니다. 

프로그램을 배우신 분이라면 당연히 아시겠지만....num_col 에는 num 의 값이 들어가는게 아니라 주소값이 들어 가기 때문입니다.

>

원하는 결과를 얻는 방법은 2가지가 있습니다. 

for j in range(10):
    random.seed()
    for i in range(6):
        num.append(random.randint(0,9))
    num_col.append(num)
    num=[]

위와 같이 num.clear() 대신 num=[] 같이 새로운 값을 할당해 버리면 됩니다. 그러면 새로운 객체가 생성되고 num 의 주소값이 바뀌기 때문에 저 위와 같은 문제가 없습니다. 

>

또 한가지 방법이 copy 명령을 써서 변수를 복사 하는 겁니다. 

import random
import copy

num=[]
num_col=[]

for j in range(10):
    random.seed()
    for i in range(6):
        num.append(random.randint(0,9))
    num_col.append(copy.copy(num))
    num.clear()

이렇게 하면 새로운 객체를 생성해서 값을 모두 복사해서 num_col 에 추가 하기 때문에 문제가 없습니다. 

copy 대신 deepcopy 도 있는데 위와 같은 경우는 어느 걸 써도 차이가 없습니다. 이를 간단히 테스트를 해 보면....

>>> num1=[1,2,3,4,5]
>>> num2 = copy.copy(num1)
>>> id(num1[0])
9468256
>>> id(num2[0])
9468256
>>> num2=copy.deepcopy(num1)
>>> id(num1[0])
9468256
>>> id(num2[0])
9468256

copy나 deepcopy 를 쓰면 num1 과 num2 의 id 값은 달라지지만 num1[0] 과 num2[0] 의 id 값은  copy를 하나 deepcopy 를 하나 동일합니다. 

 하지만 아래와 같은 경우는 차이가 있습니다.

>>> num1=[[1,2,3]]
>>> num2 = copy.copy(num1)
>>> id(num1[0])
140714158508608
>>> id(num2[0])
140714158508608
>>> num2 = copy.deepcopy(num1)
>>> id(num1[0])
140714158508608
>>> id(num2[0])
140714150150784

num1[0] 와 num2[0] 의 id 값을 비교해 보면 copy 와 deepcopy 했을때의 차이를 보실 수 있습니다.

 

결론적으로 말하자면....보통은 copy 를 써도 되지만, 완전한 복사를 하려면 deepcopy 를 쓰는게 확실하다는 겁니다. 


댓글

이 블로그의 인기 게시물

pygame 에서 이미지 회전하는 방법

 pygame 에서 transform.rotate 를 사용해서 이미지를 회전시켜 보면 생각과는 달리 요상하게 회전합니다.    따라서 이를 해결해 보고자 검색해 보다 다음 링크를 찾았습니다. https://stackoverflow.com/questions/4183208/how-do-i-rotate-an-image-around-its-center-using-pygame/54714144 위 링크를 보면 파이게임의 이미지 회전이 왜 그렇게 이상한지 알 수 있고 답변하신 분이 blitRotate 라는 함수를 만들어 놓아서 이용할 수 있습니다.  제 소스에 가져와서 테스트를 해 봤는데 제 생각대로 회전 하더군요.  def blitRotate(image, pos, originPos, angle):       #calcaulate the axis aligned bounding box of the rotated image     w, h       = image.get_size()     box        = [pygame.math.Vector2(p) for p in [(0, 0), (w, 0), (w, -h), (0, -h)]]     box_rotate = [p.rotate(angle) for p in box]     min_box    = (min(box_rotate, key=lambda p: p[0])[0], min(box_rotate, key=lambda p: p[1])[1])     max_box    = (max(box_rotate, key=lambda p: p[0])[0], max...

antix linux 업데이트시 GPG Error

 최근에 가장 가벼운 리눅스를 검색해서 antix 리눅스를 설치해서 테스트 해 보고 있습니다. 역시 가볍긴 가볍더군요. 생각보단 패키지 구성도 괜찮아 보였고요.    설치후 좀 써보고 업데이트를 하는데 GPG Error 가 발생했습니다. GPG 키 관련 문제인것 같아서 검색해 보니 antixforum에 답이 있었습니다.  https://www.antixforum.com/forums/topic/how-to-fix-expired-gpg-key-error/   간단히 적어보자면... http://repo.antixlinux.com/bookworm/pool/main/a/antix-archive-keyring/antix-archive-keyring_20019.5.0_all.deb 위 파일을 받은 다음에 터미널에서... sudo dpkg -i antix-archive-keyring_20019.5.0_all.deb 을 실행해서 설치해 주면 됩니다.    그런다음 업데이트를 시도해 보면 잘 됩니다.   

모닝 JA 엔진오일 교환. 보쉬필터 구입

요즘은 주행거리가 1만km 가 안되다보니 1년에 한번씩 엔진오일을 교환하고 있습니다.  1년에 한번이라 그냥 오토큐에서 교환을 했었지만 오토큐의 오일교환 가격이 너무 오른데다가 이젠 보증도 끝났기 때문에 오일과 필터를 구입해서 공임나라로 갔습니다.  > 오일은 kixx g1 fe 1L x 3 을 구입하고 필터는 보쉬제품으로 구입했습니다.   A3003 이 에어필터이고 O0356 이 오일필터 입니다. 기아의 순정부품보단 조금 가격이 저렴합니다.  > 오랜만에 공임나라 갔는데 교환공임이 17000원 이네요. 물가가 오른만큼 오일교환 비용도 예전보다 좀 올랐네요.  필터 품번도 기록해 둘겸 올려 봅니다. ^^;