1. 파이썬 데이터
컴퓨터 메모리는 컴퓨터 시스템에서 데이터와 프로그램을 저장하는 곳이다. 프로그램은 운영체제로부터 메모리 공간을 할당받아 사용하는데, 이는 파이썬 프로그램도 마찬가지이다. 이 메모리 공간은 0과 1로 이루어진 비트(bit)덩어리로 채워지고, 컴퓨터는 이 비트덩어리를 해석한다.
그런데 같은 비트라도 해석에 따라 다른 것을 의미할 수 있다. 예를들어 메모리에 저장된 '01000001'의 비트배턴은 정수로 해석하면 65가 되고, 문자로 해석하면 'A'가 된다. 그렇다면 이들을 어떻게 구별할 수 있을지가 문제된다.
파이썬은 각 데이터 값(정수, 숫자, 함수 등)을 메모리에 객체로 wrapping한다. 파이썬에서 객체는 ① 타입, ② 다른 객체와 구별하기 위한 고유 ID, ③ 값, ④ 참조횟수를 포함하는 데이터 덩어리이다. 책에서는 컴퓨터 메모리를 선반으로, 객체는 선반에서 공간을 차지하는 가변 크기 상자로 비유하고 있다. 파이썬은 객체 상자를 만들어 선반의 빈 곳에 놓고, 더이상 사용하지 않을때 제거한다는 것이다.
데이터 값을 변경할 수 있는지 여부는 타입에 의해 결정된다. 가변 객체는 값을 변경할 수 있으나 불변 객체는 변경할 수 없다. 그러나 파이썬은 강타입(strong type) 언어여서 가변 객체여도 객체의 타입은 변경할 수 없다.
2. 변수
파이썬에서 데이터 값은 리터럴 값(123, 3.14, 'abcd' 등)이나 변수로 명시할 수 있다. 파이썬은 등호 (=)를 사용하여 변수에 값을 할당한다. 여기서 할당은 값을 복사하는 것이 아니고, 데이터를 포함하는 객체에 이름을 붙이는 것이다. 즉, a = 5 는 ① 값이 5인 정수 객체를 생성하고, ② 변수 a가 객체 5를 가리키도록 하는 코드이다.
다음 예시를 통해 가변객체와 불변객체의 차이를 이해해 보자.
### case 1
x = 5
y = x
x = 29
print(x, y)
# output : 29 5
### case 2
x = [2, 4, 6]
y = x
x[0] = 99
print(x, y)
# output : [99, 4, 6] [99, 4, 6]
c언어 등 다른 언어에서는 변수 자체에 타입이 존재하고 특정 메모리 위치에 바인딩 된다. 그렇기에 타입이 고정되고, 값을 변경하더라도 해당 타입의 값만을 저장할수 있다. 따라서 c언어는 int x = 7; 과 같이 변수 타입을 선언해주어야 하는 정적 언어이다. 아래 예시에서 알수 있듯이, c언어에서는 동일한 scope 내에서 같은 이름의 변수를 중복선언할 수 없다. c언어에서 변수는 메모리의 특정 영역을 가리키는 이름이므로, 이름이 중복된다면 어떤 변수의 메모리 공간을 사용해야 할지 모호해지기 때문에 컴파일러가 허용하지 않는다.
#include <stdio.h>
int main() {
char x = 's';
int x = 10;
printf("%d", x);
return 0;
}
// main.c: In function 'main':
// main.c:5:9: error: conflicting types for 'x'; have 'int'
// 5 | int x = 10;
// | ^
// main.c:4:10: note: previous definition of 'x' with type 'char'
// 4 | char x = 's';
// | ^
// [Compilation failed with exit code 1]
이와 달리 파이썬은 동적언어여서 중복선언도 가능하고, 변수 이름은 어떤 타입이든 가리킬 수 있다.
x = 's'
x = 7
print(x)
# 7
# [Execution complete with exit code 0]
3. 기타 알게된 것들
- bool() 함수는 어떤 값을 인수로 취해 불리언 값을 반환한다
- 숫자를 표현할때 첫번째 이후 모든 위치에 언더바를 사용할 수 있다 ex) 1_000_000 (1000000과 동일)
- divmod로 몫과 나머지를 동시에 얻을 수 있다 ex) divmod(9,5) 는 (1,4)를 반환함
- print(0b10)은 2, print(0x10)은 16을 출력시킨다
- chr()함수는 정수를 단일 문자열로 반환하고 ord()함수는 단일 문자열을 정수로 반환한다
- int()에서 10진수가 아닌수를 10진수로 변환할 수 있다 ex) int('10', 2)는 2를 반환함
- 파이썬3에서는 long이 사라지고 int의 크기가 유연해졌기 때문에, 다른 언어와 달리 아주 큰 정수도 문제없이 처리한다.
'독서 > Introducing Python' 카테고리의 다른 글
[OIP] chapter 10 : 객체와 클래스 (0) | 2024.07.27 |
---|---|
[OIP] chapter 9 : 함수 (0) | 2024.07.22 |
[OIP] chapter 7,8 : 튜플, 리스트, 딕셔너리, 셋 (1) | 2024.07.15 |
[OIP] chapter 4,5,6 : 조건·반복문, 문자열 (0) | 2024.07.06 |
책 소개 : O'Reilly's Introducing Python (1) | 2024.06.25 |