파이썬 변수 이해하기

파이썬 변수 이해하기

변수(Variable)

파이썬에서 변수란, 값을 할당할 수 있는 이름이자, 작성할 코드 안에서 할당한 값을 참조하는 데 사용된다.

변수는 프로그래밍에서 중요한 역할을 하는데, 그 이유는 다음과 같다.
  1. 변수는 값에 접근할 수 있도록 유지한다.
    예를 들어, 일부 시간을 많이 소모하는 연산의 결과를 변수에 할당해주면, 필요할때 마다 매번 연산을 수행해서 얻는 것이 아니라 변수에 이미 할당된 값을 사용하면 된다.
  2. 변수는 값에 문맥(상황)을 부여한다.
    숫자 28은 한 반의 학생 수, 혹은 접속한 유저의 수 등 많은 의미를 가질 수 있다. 하지만 28이란 값을 num_students, 즉, 학생 수를 의미하는 변수를 만들고 그곳에 할당해 준다면 값의 뜻은 확실해진다.

할당 연산자

변수에서 값은 =라는 특별한 기호를 사용해서 변수에 할당이 되는데, 이 기호를 할당 연산자라고 부른다. 연산자는 =+ 같은 하나 이상의 값에서 연산을 수행하는 기호를 뜻한다.

예를 들어, + 연산자는 두 개의 숫자를 취하는데, 하나는 연산자 왼쪽에, 다른 하나는 오른쪽에 위치하며, 연산자로서 두 개를 합쳐준다. 마찬가지로 = 연산자는 연산자 오른쪽에 위치한 값을 취해 연산자 왼쪽에 위치한 이름(변수)에다가 할당한다.

다음과 같이 할당 연산자를 사용할 수 있다.

>>> phrase = "Hello, world"
>>> print(phrase)
Hello, world

첫 번째 줄에서, phrase라는 이름을 가진 변수가 생성되고 "Hello, world"라는 값이 = 연산자를 사용해 변수에 할당되었다.

마지막 줄에 출력된 Hello, worldprint(phrase)를 실행했을 때 보여지는데, 왜냐하면 파이썬이 print 함수 안에 있는 phrase라는 이름을 조회하고, "Hello, world"라는 값이 변수 phrase에 할당되었다는 것을 발견하기 때문이다.

여기서 만약 phrase = "Hello, world"print(phrase)를 실행하기 전 할당하지 않았다면 변수는 존재하지 않기 때문에 NameError를 마주하게 된다.

주의할 점
=라는 기호가 기존에 수학에서 쓰이던 기호와 똑같아 보이지만, 실제로 파이썬, 혹은 프로그래밍에서는 완전히 다른 의미를 가진다. 언제 = 연산자를 마주하던, 파이썬에서는 연산자가 오른쪽에 위치한 값을 연산자 왼쪽에 있는 변수에 할당해주는 역할이라고 생각하면 된다.

한 가지 더 기억해야 할 것은, 파이썬에서 변수 이름은 대소문자를 가린다는 것(case-sensitive)이다. 그러므로 phrase라는 변수 이름은 Phrase라는 변수의 이름으로부터 구별된다.

예를 들어 다음과 같은 코드는 NameError를 발생한다:

>>> phrase = "Hello, world"
>>> print(Phrase)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'Phrase' is not defined

유효한 변수 이름의 규칙

파이썬에서 변수 이름은 원하는 만큼 길게, 혹은 짧게 만들 수 있다. 하지만 변수에 이름을 정할 때 꼭 따라야 하는 몇 가지 규칙이 존재한다.

변수 이름의 규칙은 다음과 같다.
  • 변수 이름은 오직 대문자와 소문자만 포함할 수 있다(A-Z, a-z).
  • 숫자를 포함할 수 있다(0-9).
  • 밑줄을 포함할 수 있다(_).
  • 변수의 이름은 숫자로 시작할 수 없다.

예를 들면 phrase, string1, _a1p4a, list_of_names 같은 변수의 이름은 유효하지만 9lives같이 숫자로 시작하는 변수는 유효하지 않다.

파이썬 변수 이름은 여러 가지 유효한 유니코드(unicode) 문자를 포함할 수 있다. 유니코드란 전 세계 대부분의 문자 체계에서 사용되는 텍스트를 디지털로 나타내는 표준이다.

즉, 파이썬 변수 이름은 영어가 아닌, é와 ü와 같은 장식된 문자와 한글, 중국어같이 다른 언어도 포함할 수 있다는 것이다.

하지만, 모든 시스템에서 장식된 문자가 표시될 수는 없다. 그러므로 만약 작성할 코드가 많은 지역에서 사용될 예정이라면, 장식된 문자를 피하는 것이 바람직하다.

변수 이름이 유효한 이름이라고 해서 그 변수의 이름이 좋은 이름이라고는 할 수 없다. 좋은 변수 이름을 고르는 것은 매우 어려운 일이 될 수 있지만, 다음과 같이 더 좋은 이름을 고르는 것을 도와주는 가이드라인이 존재한다.


설명하는 이름이 짧은 이름보다 낫다.

변수가 무슨 역할을 하는지 설명하는 변수 이름은 특히나 복잡한 프로그램에서 매우 필수적이다. 종종 설명하는 변수의 이름을 짓기 위해서는 다수의 단어가 요구되지만, 짧은 단어보다 훨씬 낫기 때문에 긴 단어를 사용하는 데 두려워할 필요가 전혀 없다.

다음 예제를 보면, 값 3600은 s라는 변수에 할당되어 있다:

s = 3600

s라는 변수 이름은 매우 모호하다. 왜냐하면 s = 3600이란 것만 보면 무슨 의미를 가지고 있는지 전혀 유추할 수 없기 때문이다.

변수의 이름을 완전한 단어로 만들어 줌으로써 코드가 무슨 의미를 가지고 있는지 더 쉽게 이해할 수 있다:

seconds = 3600

초를 의미하는 seconds라는 변수 이름을 사용함으로써 더 나은 문맥을 제공할 수 있다.

하지만 이조차도 코드의 완전한 의미를 전달하지는 못한다. 왜냐하면 3600이란 초를 나타내는 숫자가 어떤 작업을 끝내기 위해 걸리는 시간인지, 아니면 어떤 동영상의 길이인지 알 수 있는 방법이 없기 때문이다.

다음과 같은 이름을 사용하면 더 이상 코드가 무슨 의미를 가지고 있는지 단번에 알 수 있게 된다.

seconds_per_hour = 3600

위와 같은 코드를 마주하면 3600이라는 숫자가 한 시간을 초로 나타낸 것이라는 것에는 의심의 여지가 없다. seconds_per_hour이라는 변수의 이름이 sseconds보다 더 많은 입력을 요구하지만, 반대로 훨씬 더 투명한 의미를 제공한다.

이쯤에서 '그럼 모든 변수는 최대한 길게 만들어서 의미를 명확하게 나타내야 하나?'라는 생각이 들 수 있지만, 역시나 과하게 이름을 길게 짓는 행위도 피해야 한다. 과하게 길다는 의미는 객관적이지만, 서너 단어 이하로 변수의 이름을 지어주는 것이 바람직하다.


파이썬 변수 이름 컨벤션

많은 프로그래밍 언어에서 변수의 이름을 numStudentslistOfNames 같이 카멜케이스(camelCase) 형식으로 짓는 것은 매우 흔하다.

카멜케이스란 첫 번째 단어의 첫 글자를 제외하고 모든 단어의 첫 글자를 대문자로 작성하는 표기법이다. 소문자와 대문자로 문자가 짜여 있는 모습이 낙타의 혹 같아서 붙여진 이름이다.

하지만 파이썬에서는 변수의 이름을 num_studentslist_of_names와 같이 스네이크 케이스(snake case)로 작성해주는 것이 더 흔한 방법이다. 모든 글자는 소문자로 작성하며, 매 단어를 밑줄로 구분해주는 방법이다.

스네이크 케이스로 파이썬 코드를 작성하면 안 된다는 법이나, 작성했을 때 코드가 구동되지 않는 것은 아니지만, PEP8에서는 스네이크 케이스를 사용하는 것을 좋은 관습이라고 여겨진다.

Reference