** 파이썬의 변수는 인스턴스를 가르키는 이름
-> 변수에 새로운 데이터를 대입하는 것이 아니고 데이터가 차지한 공간에 이름을 붙히는 것.
-> 파이썬에서는 동일한 리터럴을 가르키는 변수를 2개 생성하면 2개 가리키는 공간이 같습니다.
#a에 1을 대입합니다
#1을 메모리에 저장하고 그 데이터 공간에 a라는 이름을 붙인 것입니다
a=1
#1이라는 리터럴이 존재하는지 확인하고 존재하면 그 공간에 b라는 이름도 붙횝니다.
b=1
#2개는 동일한 리터럴을 가리키기에 id가 같다.
print(id(a))
print(id(b))
a=2
print(id(a)) # 다른 리터럴을 가리키므로 idr가 바뀐다.
print(id(b))
실행 결과: 4332841312 # 1의 값
4332841312 # 1의 값을 공유
4332841344 # 2가 되버린 새로운 메모리
4332841312 # b는 그대로 1의 값
2. 변수 사이의 대입
-> 변수를 다른 변수에 대입하면 데이터의 참조가 복사됩니다.
-> 1개인 데이터를 가르키는 변수를 대입하면 값이 복사된 것처럼 서로 간에 영향이 없습니다.
1개가 아닌 list , set ,tuple , dict , instance(클래스의 객체) 를 대입하면 참조가 복사된 것 처럼 동작하기 때문에
하나가 자신의 일부분을 변경하면 다른 변수에게도 영향을 줍니다.
되도록이면 이 동작은 하지 않는 것이 좋습니다.
a= 10
b= a # a가 스칼라 데이터라서 a값인 10을 b에 복사해주는 것과 같은 효과
print(a)
print(b)
#동일한 값이 출력됩니다.
10
10
b= 20
print(a)
print(b)
#b의 값을 변경해도 a에는 영향이 없습니다
10
10
10
20
#여러개의 데이터를 가진 변수를 복사하고 부분적으로 데이터를 수정하면
#원본에도 영향을 마치게 됩니다.
li1 = ['아이폰' , '아이폰xs' , '아이폰12','맥북']
li2 = li1
print(li1)
print(li2)
li2[0]= "맥북"
print(li1)
print(li2)
li3= li2
li3= ["갤럭시', '갤럭시버즈','갤럭시21,'갤럭시노트']
#li3 전체를 변경한 것입니다
#li2에 영향을 주지 않습니다
3. 얕은 복사(week copy) 와 같은 복사(deep copy)
1)얕은 복사
-> 여러 개의 데이터를 가진 데이터를 복사할 때 원본 데이터를 새로운 곳에 복사해서 대입해주는 것
얕은 복사를 하게되면 부분적으로 데이터를 수정했을 때 원본에 영향을 주지 않습니다.
copy 모듈 copy라는 함수를 이용해서 수행
li3=copy.copy(li3)
print('li1':li1)
"
"
동일한걸 볼 수 있다.
li2[0] = "HANA08"
print('li1:',li1)
print('li2:'li2)
copy 함수를 이용해서 복사 했기 때문에 완전히 새로운 데이터이기 때문에 li2 가 부분적으로
변경한것에 영향을 받지않는다
-> 얕은 복사는 재귀적으로 복제를 하지 않기 때문에 데이터의 모임 안에 다시 데이터의 모임이 있는 경우는 서로간에 영향을 주게 됩니다.
2) 깊은복사
-> 복사를 할 때 재귀적으로 복제를 해서 복사하는 방식
-> 데이터 모임 안에 데이터 모임이 있으면 이것도 다시 복제해서 복사하는 방식
-> 데이터를 새로운 곳에 완전히 복사해서 돌려주는 방식
-> copy.deepcopy 함수로 수행
-> 이렇게 복사가 되면 원본의 변화가 복사본에 영향을 주지 않고 복사본의 변화도 원본에 영향을 주지 않는다.
3) 참조 대입 , 얕은 복사 , 깊은 복사
-> 참조를 대입하게 되면 메모리는 절약할 수 있지만 프로그램의 코드를 파악하기가 어려워지고 유지보수가 어려워 집니다.
-> 깊은 복사를 하게 되면 메모리 사용량은 늘어나지만 , 서로간의 영향을 주지 않기 때문에 유지보수가 쉬워진다
-> 데이터 분석(AI,머신러닝) 분야등에서 하나의 데이터를 가지고 여러 번 작업을 수행해서 결과를 만들기 원본 데이터가 변경되는 것을 금기시 합니다. 되도록이면 깉은 복사를 권장합니다.
R 은 기본적으로 깊은 복사를 채택합니다.
python에서는 기본적으로 참조를 대입하는 형태로 대입을 하지만 numpy 나 pandas 패키지처럼 데이터 분석의 기본이 되는
패키지에서는 깊은 복사를 사용합니다.
GUI ( windows , android , ios 등) 프로그래밍에서 기본적으로 참조를 대입하는 형태로 동작합니다.
GUI 프로그램은 대부분 디자인을 XML 파일 같은 곳에서 하고 여기서 디자인 한 화면을 코드에서 다시 가져와서 사용한다.
디자인을 변경했을 때 코드에 바로 적용이 되도록 할려면 참조를 대입하는 형태로 해서 하나의 변경이 다른 하나에 바로 적용되어야 한다
4) 메모리 관리
-> 데이터를 생성하면 참조 카운트를 같이 생성해서 1을 대입합니다.
-> 다른 곳에 참조를 대입하면 참조 카운트가 1증가 합니다.
-> None을 대입하거나 자신을 생생한 영역이 종료되면 참조 카운트가 1 감소 합니다
-> 참조 카운트가 0이 되면 메모리에서 정리 대상이 되서 더 이상 사용할 수 없는 상태가 됩니다.
이런 메모리 관리가 중요한 곳은 스마트 폰 처럼 업그레이드가 안되는 기기의 프로그램이나 게임처럼 오랜시간 동안 작업을
수행하는 프로그램을 만들 때는 중요합니다.
5)weakref 모듈
-> 참조를 대입하는데 참조 카운트를 증가시키지 않고 대입하는 모듈입니다.
weakref.ref(데이터) 형태로 사용합니다.
스마트 폰 프로그래밍이 이런 방식으로 대입을 합니다.
'Python' 카테고리의 다른 글
[파이썬] 기본 네트워크 & 데이터 처리 (0) | 2021.01.31 |
---|---|
[파이썬] 자료규조 (0) | 2021.01.31 |
[파이썬] 쓰레드 (0) | 2021.01.30 |
[파이썬] 파이썬의 모듈 (0) | 2021.01.30 |
[파이썬] 파이썬 정리2 (0) | 2021.01.24 |