본문 바로가기

Python/Python Basics

python에서 리스트 복사 및 같은 주소 참조

list1=[1,2,3,4,5]
# list2는 list1이 가리키는 list와 동일한 주소
list2=list1
# 아래 두 줄은 동일한 id를 출력함
print("list1 id :", id(list1))
print("list2 id :", id(list2))
#################################

# list2는 list1을 바탕으로 slicing을 통해 복사된
# list1과 똑같이 생겼지만, 또다른 list인 녀석을
# 가리킨다.
list2=list1[:]
# 아래 두 줄은 다른 id를 출력함
# 지금의 list1과 위에서의 list1은? - 동일
print("list1 id :", id(list1))
print("list2 id :", id(list2))

# 마찬가지로 
list3=list1[0:len(list1)]
list4=list1.copy()
print("list3 id :", id(list3))
print("list4 id :", id(list4))

print("1의 주소 in list1 :",id(list1[0]))
print("1의 주소 in list4 :", id(list4[0]))

변수명 = 리스트를 가리키는 변수

( 예를 들어

list1=[1,2,3,4,5]

list2=list1 

)

에서 list2는 list1을 바탕으로한 새로운 리스트를 가리키게 되는 것이 아닌, list1이 참조하는 [1,2,3,4,5] 라는 리스트(주소값이 1000 번지라고 하자)를 가리키게 된다.

list1과 list2 모두 주소값 100번지를 가리키는 것이다.

 

Q. 그렇다면, [1,2,3,4,5]의 형태로 생긴 리스트는 1000번지에 하나만 존재해야하는가?

* 아니다.

list1[:] 이나 list1.copy() 를 통해 list1과 동일하게 생긴 새로운 리스트를 다른 주소에 또 다시 만들 수 있다.

 

Q. list1[0]과 list4[0]은 모두 1을 가리키는데 이 아이들은 같은 1일까 다른 1일까?

즉 같은 주소값에 존재하는 하나의 1이라는 숫자일까, 다른 주소값에 존재하는 1이지만, 다른 1일까??

* 같은 1이다.

 

Q. 같은 list1[0]의 값을 5으로 바꾸면 list4[0]의 값도 5으로 바뀔까?

* 아니다.

list1[0] 과 list4[0]이 모두 주소값 100번지에 있는 1이라는 숫자를 가리키고 있다고 치자 ( 사실 python에서는 숫자도 다 객체임 )

여기서 list1[0]의 값을 5으로 변경하게되면 주소값 100번지의 숫자가 1에서 5으로 변경되는 것이 아니라,

int형 객체들의 주소는 그대로이고 list1[0]이 가리키는 주소 자체가 바뀌는 것이다.

 list1[0]은 5이라는 숫자의 주소값을 가리키게 되는 것이고 list4[0]은 여전히 주소값 100번지에 있는 1을 가리킨다.