[python] python3 힘들게 배우기 #14

4 분 소요

ex38. 파이썬의 명령 실행 과정에 대해서

예전 예제들 중에 list에 append 명령을 이용하여 element를 추가하는 과정을 수행해 본 적이 있다. 이 과정은 정확히 어떻게 이루어지는지 한번 알아보도록 하자.

아래와 같은 빈 리스트에 요소 하나를 추가하는 과정이 있다고 해보자.

myList = []
myList.append('myElement')
print(myList)

위 명령을 수행하면?

['myElemnt']

이렇게 나올 것이다.

이 과정을 자세히 들여다보자.

2번쨰 줄인 myList.append('myElement')후 엔터키를 치는 순간

  1. 파이썬은 먼저 myList를 발견한 후, 해당 변수를 찾기 시작한다. 바로 위에 줄에서 선언해 놓았기 때문에 뒤쪽으로도 찾는다. 여기서는 list지만 이것이 함수든, 글로벌 변수든간에 하여튼 찾기 시작한다.

  2. myList가 어떤 것인지 찾은 후에, 뒤에 붙어 있는 . (period) 오퍼레이터를 읽는다. .은 해당 객체의 하위 단계에 있는 variable을 찾게 한다. myList 는 list 객체이므로, myList는 다양한 function을 갖고 있을 것이다.

  3. 이후 append를 읽는 순간, appendmyList가 갖고 있는 variable인지 아닌지 판단한 후에, 갖고 있는 것이 맞다면, 파이썬은 append 명령을 수행한다.

  4. 다음으로 ( (첫번째 괄호)를 읽으면, 파이썬은 ‘이것은 함수로군’하고 깨닫게 된 후, 함수를 실행하기 되지만 이 때 추가 argument 와 함꼐 수행하게 된다.

  5. 추가 argment는 바로… myList이다!! 약간 이상하게 들리겠지만, 파이썬이 이렇게 동작한다. 즉 우리가 myList.append('myElement')로 썼음에도 불구하고, 파이썬에서는 append(mystuff, 'myElemnt') 로 명령을 수행하는 것이다!!

어떻게 이렇게 되는 것일까? 아직 class를 배우진 않았지만, 아래 예제를 그냥 한 번 보자.

>>> class Thing(object):
	def test(message):
		print(message)


>>> a = Thing()
>>> a.test('hello')
Traceback (most recent call last):
  File "<pyshell#51>", line 1, in <module>
    a.test('hello')
TypeError: test() takes 1 positional argument but 2 were given

마지막 줄을 보자. 분명 실행을 a.test('hello')라고, argument를 하나만 넣었음에도 불구하고, 2개를 받았다 고 되어있다!! 이는 즉 파이썬이 a.test('hello')를 자기 멋대로 test(a, 'hello')로 변경했기 떄문에 생긴 일이다.(그렇다고 test(a, 'hello')라고 입력해도 된다는 건 아니다.test를 읽어들이는 순간 파이선은 test변수(함수)가 선언되어 있지 않기 때문에 에러를 뱉을 것이다.) 지금은 좀 이해가 되지 않겠지만, 앞으로 몇 개의 예제를 따라 하며 해당 개념과 클래스에 대해 배워보자.

아래 예제를 실행해 보자.

#여섯 개의 요소를 가진 리스트를 만들어 볼까요?

List = ['one', 'two', 'three', 'four']
print(List)

#아직 요소가 네 개 뿐이군요...

more_elements = ['five', 'six', 'seven', 'eight']

while len(List) =! 6: #List 개수가 6개가 될 때 까지 무한이 도는 loop
    next_element = more_elements.pop()
    print("다음 요소를 추가합니다 :", next_element)
    List.append(next_element)
    print(f"이제 List 요소의 개수는 {len(List)}개입니다.")

print("다 된 것 같군요.")
print("완성된 리스트로 멋진 것을 해 봅시다.")

print(List[1])
print(List[-1]) # -1은 가장 끝 요소 0은 가장 첫 요소임
print(List.pop()) #pop으로 뽑아낸 것만 프린트. pop은 마지막 요소인 seven을 꺼낼 것이다.
print(' '.join(List))
print('#'.join(List[1:3]))

실행하면 아래와 같다.

['one', 'two', 'three', 'four']
다음 요소를 추가합니다 : eight
이제 List 요소의 개수는 5개입니다.
다음 요소를 추가합니다 : seven
이제 List 요소의 개수는 6개입니다.
다 된 것 같군요.
완성된 리스트로 멋진 것을 해 봅시다.
two
seven
seven
one two three four eight
two#three

마지막 세 개 실행을 보았을 때 짐작하겠지만, pop명령은 List 본체를 변형한다. 그러나 join명령을 사용하면 List 의 요소를 이용해 새로운 string을 만들어낼 뿐, 원래의 리스트인 List는 그대로 남아 있다. 그래서 join을 두 번 사용할 수 있었던 것이다.

마지막 명령문에 쓰인 [ : ]은 range( , ) 와 비슷하게 쓰인다. 즉 index 1부터 index 3 이전까지의 요소를 조인하라는 뜻.

댓글남기기