본문 바로가기
파이썬/Basics(기초)

[Python] 11. 변수(variable)의 복사와 참조

by 쿠킷리스트 2021. 10. 6.

학습내용

#1 : 변수(variable)란

 파이썬에서 사용하는 변수는 객체를 가리키는 것이라고 말할 수 있으며, 객체란 자료형과 같은 것을 의미.

a = [0,1,2,3,4]

a = [0,1,2,3,4]
id(a)
#139984599077584
  • a = [0,1,2,3,4]라는 코드는 [0,1,2,3,4] 값을 가지는 리스트 자료형(객체)이 자동으로 메모리에 생성되고 변수 a는 [0,1,2,3,4] 리스트가 저장된 메모리의 주소를 가리키게 된다.
  • id( )를 사용해 변수가 가리키고 있는 개체의 주소 값을 반환할 수도 있다.

#2 : 복사와 참조

 아래 그림에서 참조를 공유하면 a와 b가 하나의 메모리 주소를 가리키고 있기 때문에 a의 값을 바꾼다면 b의 값도 바뀌게 된다. 따라서, 각각의 변수를 달리 쓰고 싶다면 복사를 하고, 각각 변수가 각각의 메모리 주소를 가리키면 a의 값을 바꾼다고 해도 b에는 변화가 없다.

 빅 데이터 분석을 할 때 메모리가 부족할 수 있다. 대량의 데이터들을 복사하다보면 용량이 불어나면서 메모리가 부족할 수 있으므로 유의.


#3 : 리스트를 복사하고자 할 때

#참조
a = [0,1,2,3,4]
b = a
print(id(a))
print(id(b))
# 139984530575680
# 139984530575680
  • 위와 같이 코드를 짤 경우 복사가 아닌 참조로 a, b 모두 똑같은 메모리 주소를 가리킨다.

1) [:]이용

a = [0,1,2,3,4]
b = a[:]
b is a
#False
print(id(a))
print(id(b))
# 140253553208608
# 140253552965264
  • b = a[:]는 a를 복사해서 b에 넣어달라라는 뜻. 
  • is는 동일한 객체인지를 물어보는 것. 값이 같느냐를 물어보는 것이 아님.
  • 따라서 복사, 복제, 깊은 복사, 값을 새로 만든 경우 is를 사용하면 False 값이 나옴.

2) copy 모듈 이용

a = [0,1,2,3,4]
from copy import copy
b = copy(a)
b is a
#False
print(id(a))
print(id(b))
# 140253552899088
# 140253553009760
  • copy 모듈을 이용해서도 복사, 복제를 할 수 있으며 is를 통해 확인하면 복제, 복사가 된 것을 확인할 수 있다.

#4 : 예제와 함께 복습

a = 1
b = 1
print(id(a))
print(id(b))
if a is b:
    print("True")
else:
    print("False")
#True

a = [1,2,3]
b = [1,2,3]
print(id(a))
print(id(b))
if a is b:
    print("True")
else:
    print("False")
#False

a = 12353458478329547328957829
b = 12353458478329547328957829
print(id(a))
print(id(b))
if a is b:
    print("True")
else:
    print("False")
#False
  • is는 값을 비교하는 것이 아니라 주소를 비교하는 것.
  • 정수라 해서 다 되는 것이 아니라 작은 정수들만 가능.
  • 리스트, 튜플, 딕셔너리 모두 값이 똑같더라도 각기 다른 곳에 저장된다.

댓글