2.2. 변수와 기본 타입¶
변수는 = 연산자로 값에 묶는 이름입니다. 대입 후에는 그 이름을 값이 사용될 수 있는 어디서든 사용할 수 있습니다:
width = 320
height = 240
pixels = width * height
print(pixels) # prints 76800
=의 오른쪽이 먼저 평가된 다음, 그 결과가 왼쪽의 이름에 묶입니다. 한 번도 대입되지 않은 이름을 읽으면 NameError가 발생합니다.
변수는 그저 레이블입니다. 변수는 값을 가리키며 – 값은 다른 곳에 존재하고, 같은 값에 임의의 개수의 레이블이 붙을 수 있습니다.
변수는 값을 가리키는 레이블입니다. 변수를 재할당하면 레이블이 옮겨질 뿐, 그 레이블이 이전에 가리키던 값은 바뀌지 않습니다.¶
2.2.1. 이름 규칙¶
이름은 문자나 밑줄로 시작하며 문자, 숫자, 밑줄을 포함할 수 있습니다.
frame_count와_internal은 괜찮지만,1st_frame은 문법 오류입니다.이름은 대소문자를 구분합니다:
Width와width는 서로 다른 두 변수입니다.list,str,id(),print()같은 내장 이름을 다시 사용하지 마세요 – 이를 가려도 오류는 발생하지 않지만, 원래의 내장 함수는 스크립트의 나머지 부분에서 접근할 수 없게 됩니다.관례: 변수와 함수에는
snake_case, 변경할 의도가 없는 상수에는ALL_CAPS, 클래스 이름에는CamelCase를 사용합니다.
2.2.2. 기본 타입¶
Python의 모든 값에는 어떤 연산을 지원하는지를 결정하는 타입이 있습니다. 가장 많이 작성하게 될 네 가지 타입은 다음과 같습니다:
int – 양수든 음수든 정수입니다. MicroPython 정수는 메모리가 허용하는 한 커집니다. 리터럴은 평범한 숫자로 작성합니다:
0,42,-7. 16진수(0x1A), 8진수(0o17), 2진수(0b1010) 리터럴도 유효하며 레지스터와 비트마스크에 유용합니다.float – 소수점이나 지수를 포함하는 숫자:
3.14,1.0,-0.5,2e6(= 2,000,000.0). 카메라의 모든 float는 IEEE 754 32비트이며 약 7자리의 유효 숫자까지 정밀합니다.bool – 두 리터럴
True또는False중 하나입니다(대소문자에 유의하세요).str – 작은따옴표나 큰따옴표 사이의 문자로 작성된 텍스트입니다:
"hello",'OpenMV'. 두 따옴표 스타일은 동등합니다. 문자열 안에 나타나는 따옴표 문자를 이스케이프하지 않아도 되는 쪽을 고르세요.
즉시 알아 두면 좋은 다섯 번째 값도 있습니다:
None –
NoneType타입의 유일한 값입니다. “값 없음” 또는 “아직 설정되지 않음”을 의미하는 데 사용됩니다. 명시적으로 아무것도 반환하지 않는 함수는 암묵적으로None을 반환합니다.
2.2.3. 타입 확인과 변환¶
내장 type() 함수는 모든 값의 타입을 반환합니다:
>>> type(42)
<class 'int'>
>>> type(3.14)
<class 'float'>
>>> type("hello")
<class 'str'>
각 타입은 변환 함수 역할도 겸합니다. 다른 타입의 값을 넘기면 – 변환이 잘 정의되어 있는 경우 – 새 타입의 동등한 값을 돌려받습니다:
>>> int("42")
42
>>> int(3.9)
3 # truncates toward zero, not rounds
>>> float("1.5")
1.5
>>> str(255)
'255'
>>> bool(0), bool(1), bool("")
(False, True, False)
잘 정의되지 않은 변환은 ValueError를 발생시킵니다:
>>> int("hello")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid syntax for integer with base 10
2.2.4. 재할당과 동적 타이핑¶
이름은 언제든 어떤 타입의 값으로든 재할당될 수 있습니다. 다음은 적법합니다:
x = 42
x = "now I'm a string"
x = 3.14
Python은 변수를 타입에 묶지 않습니다. x가 정수임에 의존하는 코드는 단지 그것을 사용하는 시점에 정수를 기대할 뿐입니다. 다른 것을 받으면 런타임 TypeError가 발생합니다.
참고
x를 재할당해도 이전 바인딩이 가리키던 값은 바뀌지 않습니다. 두 이름이 같은 값을 공유하더라도, 하나를 재할당하는 것이 다른 하나에 영향을 주지 않습니다:
a = [1, 2, 3]
b = a # both point at the same list
a = "different now"
print(b) # still [1, 2, 3]
공유된 값을 변경하는 것은 다릅니다: list.append 같은 메서드는 바인딩이 가리키는 값을 바꾸므로, 그 같은 값을 가리키는 다른 모든 이름이 그 변경을 보게 됩니다.