티스토리 뷰

728x90
반응형

다중 할당

파이썬에서 다중 할당은 2개 이상의 값을 2개 이상의 변수에 동시에 할당하는 것을 말한다.

문제를 보면 다음과 같이 3개의 변수에 3개의 값을 할당한 바 있다.

rev, rev.next, slow = slow, rev, slow.next

다음과 같이 두 줄로 분기하면 훨씬 더 가독성이 높은데, 굳이 한 줄로 처리한데에는 이유가 있다.

rev, rev.next = slow, rev
slow = slow.next

이렇게 두 줄로 늘어트릴 경우 rev, rev.next = slow, rev라는 구문에서 slow와 rev가 동일한 참조가 된다. 구문 중간에 rev = slow가 있으니 서로 같은 값을 참조하게 되는 것이다. 파이썬에는 원시 타입(Primiltive Types)이 존재하지 않는다. 대신 모든 것이 객체이다. 여러 가지 자료형은 물론 문자나 숫자 또한 모두 마찬가지다. 문자와 숫자의 경우 불변 객체(immutable Object)라는 점만 다를 뿐이라서, = 연산자를 이용해 할당을 진행하게 되면 값을 할당하는 것이 아니라 이 불변 객체에 대한 참조를 할당하게 된다.

문제 풀이에서처럼 rev = 1, slow = 2->3이라고 가정해보자. 여기서 slow는 연결 리스트이며, slow.next는 3이라는 의미이다.

rev, rev.next, slow = slow, rev, slow.next

이 경우 rev = 2->3, rev.next = 1, slow = 3이 되고, rev.next = 1이므로 최종적으로 rev = 2->1, slow = 3이 된다. 다중 할당을 하게 되면 이 같은 작업이 동시에 일어나기 때문에 이 모든 작업은 중간 과정 없이 한 번의 트랜잭션으로 끝나게 된다. 그러나 앞서 살펴본 두 줄 분기 코드인 다음과 같이 나눠서 처리하는 경우를 생각해보자.

rev, rev.next = slow, rev
slow = slow.next

첫 줄을 실행한 결과, rev = 2->3, rev.next = 1 따라서 rev = 2->1이 되는데 여기서 중요한 점은 rev = slow라는 점이다. 즉 동일한 참조가 되었으며 rev = 2->1이 되었기 때문에 slow = 2->1도 함께 되어 버린다. 따라서 이후에 slow = slow.next의 결과는 slow = 1이된다. 결국, 최종 결과는 rev = 2->1, slow = 1로, 앞서 풀이의 경우, 반드시 한 줄의 다중 할당으로 한 번에 처리해야 문제를 제대로 풀이 할 수 있다.





출처
파이썬 알고리즘 인터뷰 (글 : 박상길 그림 : 정진호) [책만]


728x90
반응형
댓글
반응형
250x250
글 보관함
최근에 달린 댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Total
Today
Yesterday
링크