얕은 복사와 깊은 복사
얕은 복사
-
a에는 [1,2,3]의 주소가 저장되어 있으므로 b에도 a와 동일한 주소가 복사된다.
-
그러므로 a와b는 동일한 리스트 객체를 공유한다.
>>> a = [1,2,3]
>>> b = a
>>> a[0] = 11
>>> a
[11, 2, 3]
>>> b
[11, 2, 3]
>>> id(a), id(b)
(4354094408, 4354094408)
깊은 복사
- a와b가 같은 객체를 공유하지 않게 하려면 다음과 같이 강제로 복하면 된다.
>>> a = [ 1,2,3 ]
>>> b = a[:]
>>> id(a), id(b)
(4354060168, 4354094856)
>>> a[0]=11
>>> a
[11, 2, 3]
>>> b
[1, 2, 3]
-
리스트의 경우 위와 같이 했지만
리스트 이외의 일반적인 경우에는 다음과 같이 copy 모듈을 사용한다.
-
copy() 함수는 주소가 복사되어 객체를 공유하는
얕은 복사(Shallow Copy)
-
deepcopy() 객체를 공유하지 않는
깊은 복사(Deep Copy)
>>> import copy
>>> a = [1,2,3]
>>> b = copy.deepcopy(a)
>>> a[0]=11
>>> a
[11, 2, 3]
>>> b
[1, 2, 3]
함수
- 파이썬에서 함수 선언 방법은 다른 프로그램언어와 약간 다르다.
-
함수 선언은
def
로 시작해콜론(:)
으로 끝내고
함수의 시작과 끝은 코드의들여쓰기(Indentation)
로 구분한다. -
시작과 끝을 명시해 주지 않는다.
-
함수 선언을 헤더 파일에 미리 선언하거나
인터페이스(Interface)
/구현(Implementation)
같은 부분으로 나누지 않고
함수가 필요할 때 바로 선언하고 사용할 수 있다.
def <함수명><인자1, 인자2, ... 인자N> :
<구문>
return <반환값>
-
def는 함수 객체를 만들겠다는 키워드이다.
-
파이썬에서는 변수, 클래스는 물론 함수도 객체로 취급한다.
-
파이썬에서는 블록의 개념을
들여쓰기
로 사용하기 때문에구문을 적을 때 반드시 들여쓰기를 해야한다.
-
return 문이 없어도
함수 구문의 마지막에 다다르면 함수가 종료되고 이 때 함수는 None을 반환한다.
-
return은 오직 1개의 객체만 반환할 수 있다.
하지만 다음 예제처럼 한 번의 함수 호출로 두 변수에 값을 각각 할당할 수도 있다.
-
정확히 말하자면 여러 개의 값을 반환하는 것이 아니라
하나의
튜플 객체
로 만들어 반환하는 것이다.
>>> def swap(x,y):
... return y,x
>>> swap(1,2)
(2, 1)
>>> a, b = swap(1,2)
>>> a
2
>>> b
1
>>> x = swap(1,2)
>>> type(x)
<class 'tuple'>