Gidhub BE Developer

얕은 복사와 깊은 복사, 함수

2018-01-30
goodGid

얕은 복사와 깊은 복사

얕은 복사

  • 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]

함수

  • 파이썬에서 함수 선언 방법은 다른 프로그램언어와 약간 다르다.
  1. 함수 선언은 def로 시작해 콜론(:)으로 끝내고
    함수의 시작과 끝은 코드의 들여쓰기(Indentation)로 구분한다.

  2. 시작과 끝을 명시해 주지 않는다.

  3. 함수 선언을 헤더 파일에 미리 선언하거나
    인터페이스(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'>

Recommend

Index