자료형의 참과 거짓을 구분하는 기준은 다음과 같다.
>>> a=[1,2,3,4]
>>> while a:
... a.pop()
...
4
3
2
1
조건문을 보면, a가 참인 동안(리스트 내에 요소가 존재할 동안) 마지막 요소를 계속해서 끄집어 내는 것이다.
>>> if []:
... print("True")
... else:
... print("False")
...
False
>>> if [1,2,3]:
... print("True")
... else:
... print("False")
...
True
위 코드를 해석해 보면 다음과 같다.
만약 [1,2,3]이 참이면 "True" 라는 문자열을 출력하고 그렇지 않으면 "False" 라는 문자열을 출력하라.
C나 JAVA 처럼 변수의 자료형을 함께 쓸 필요는 없다.
파이썬은 변수에 저장된 값을 스스로 판단하여 자료형을 알아낸다.
파이썬에서 사용하는 변수란, 객체를 가리키는 것이라고 말할 수 있다.
>>>a=3
위의 코드처럼 a=3이라고 하면 3이라는 값을 가지는 정수 자료형(객체)이 자동으로 메모리에 생성된다.
a는 변수의 이름이며, 3이라는 정수형 객체가 저장된 메모리 위치를 가리키게 된다.
즉, 변수 a는 객체가 저장된 메모리의 취리를 가리키는 레퍼런스(reference)라고도 할 수 있다.
파이썬의 모든 자료형은 객체라고 했다. 그러므로 3은 우리가 일반적으로 생각하는 상수값이 아닌 하나의 '정수형 객체' 이다. 따라서 a=3과 같이 선언하면, a.real 처럼 내장 함수를 바로 사용할 수 있게 된다.
파이썬에는 입력한 자료형에 대한 참조 개수를 알려주는 sys.getrefcount라는 함수가 있다. 이 함수를 이용해 정수형 객체에 참조 개수가 몇 개 있는지 살펴볼 수 있다.
>>> a,b=('python','life')
>>> (a,b)='python','life'
위의 예 처럼 튜플로 a,b에 값을 대입할 수 있고 두 명령문은 완전히 동일하다.
>>> [a,b]=['python','life']
>>> a
'python'
>>> b
'life'
위처럼 리스트로 변수를 만들 수도 있다.
또한 여러 개의 변수에 같은 값을 대입할 수도 있다.
>>> a=b='python'
>>> a
'python'
>>> b
'python'
파이썬에서는 위의 방법을 이용하여 두 변수의 값을 아주 간단하게 바꿀 수 있다.
>>> a=3
>>> b=5
>>> a,b=b,a
>>> a
5
>>> b
3
a=3을 입력하면 3이라는 정수형 객체가 메모리에 생성된다고 했다.
그렇다면 이 값을 메모리에서 없앨 수 있을까?
3이라는 객체를 가리키는 변수들의 개수를 레퍼런스 카운트라고 하였는데, 이 레퍼런스 카운트가 0이 되는 순간 3이라는 객체는 자동으로 사라진다.
즉, 3이라는 객체를 가리키고 있는 것이 하나도 없을 때 3이라는 객체는 메모리에서 사라지게 되는 것 이다.
이것을 가비지 콜렉션(Garbage Collection) 이라고 한다.
>>> a=[1,2,3]
>>> b=a
>>> a[1]=4
>>> a
[1, 4, 3]
>>> b
[1, 4, 3]
a의 값을 바꾸자 b의 값도 바뀌었다.
그 이유는, a,b는 이름만 다를 뿐이지 동일한 객체를 가리키고 있는 변수이기 때문이다.
그렇다면 b 변수를 생성할 때 a와 같은 값을 가지도록 복사해 넣으면서 a가 가리키는 리스트와는 다른 리스트를 가리키게 하는 방법은 없을까?
다음의 2가지 방법이 있다.
>>> a=[1,2,3]
>>> b=a[:]
>>> b
[1, 2, 3]
>>> a[1]=4
>>> a
[1, 4, 3]
>>> b
[1, 2, 3]
리스트 전체를 가리키는 [:]를 이용해서 복사하는 것이다.
>>> from copy import copy
>>> b=copy(a)
두번째는 copy 모듈을 이용하는 방법이다.
위 방법과 완전히 동일한 결과를 낳는다.
두 변수가 같은 값을 가지면서 다른 객체를 제대로 생성했는지 확인하려면 다음과 같이 is 함수를 이용하면 된다.
이 함수는 서로 동일한 객체인지 아닌지에 대한 판단을 하여 참과 거짓을 리턴한다.
>>> b is a
False