본문 바로가기
Programming/Python

python 다중 할당 동작방식

by 데이터현 2022. 3. 23.

python 다중 할당의 동작 방식에 대해 어렴풋이 이해하고 있었는데, 이번 기회에 확실하게 짚고 넘어가야겠다.

 

일단 파이썬에서는 다중 할당(Multiple Assignment)을 지원한다.

 

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

a, b = 1, 2
>>> a
1
>>> b
2

위와 같이 a와 b 변수 각각의 값을 1, 2로 할당해 주었다.

 

좀 더 복잡한 경우에 어떻게 동작하는지 테스트해보았다.

아래 코드를 보자.

class SingleLinkedList:
    def __init__(self, name, val=0, next=None) -> None:
        self.name = name
        self.val = val
        self.next = next
    def __repr__(self):
        return self.name
        
s1 = SingleLinkedList(name='s1', val=1)
s2 = SingleLinkedList(name='s2', val=2, next=s1)
s3 = SingleLinkedList(name='s3', val=3, next=s2)

싱글 링크드 리스트 클래스를 만들어서 S3 -> S2 -> S1 -> None 구조를 가지도록 설정했다.

 

여기서 만약 아래와 같은 코드를 실행하면 어떻게 될까?

a = None
a, a.next = s1, s3

a는 None으로 초기화가 되어 있고 당연히 a.next를 하게 되면 에러가 난다.

NoneType 객체는 next가 없다

하지만 위와 같이 다중 할당을 하게 되면 a에 싱글 링크드 리스트 객체인 s1이 들어가게 되면서(정확하게는 변수 a가 s1객체가 참조하고 있는 SingleLinkedList 객체를 참조하게 된다.)

s1.next를 사용 가능하다.

따라서 a.next에 s3가 할당되면서, s1의 next는 s3의 객체를 바인딩하게 된다.

S3 -> S2 -> S1 -> S3

 

조금 더 확실하게 이해하기 위해 아래 예시를 들어 보겠다.

아래 코드를 실행하게 되면 a의 값에는 어떤 값이 들어가게 될까?

a = None
a, a.next, a = s1, s3, a

정답은 None이다. 쉽게 느껴질 수도 있고, 어렵게 느껴질 수도 있다.

 

1. a가 None으로 초기화

2. 기존 s1, s3, a 값은 각각 s1, s3, None으로 초기화되어 있음.

3. a = s1, a.next = s3, a = a 각각 순서대로 실행됨.

4. a에 s1의 객체가 바인딩되고 a.next에 s3의 객체가 바인딩되고, a에 None이 바인딩됨.

5. 앞의 두 할당 작업이 끝나고 a에는 기존 a값이던 None이 들어가게 됨.

 

결론은 = 오른쪽 값에 기존 값을 가지고 있고, 왼쪽에 차례대로 값을 바인딩하는 것.

 

마지막 예시이다.

a = None
a, a.next, a, a.next = s1, s3, a, s2

 

이를 실행하면 오류가 난다.

3번째에 a를 None 값이 들어가기 때문에 a.next는 None.next가 되어 에러

'Programming > Python' 카테고리의 다른 글

[Python] 순열 조합 구현  (0) 2022.04.08
Python이 느린 이유?  (0) 2022.04.02
python typing optional  (0) 2022.03.23
python의 LEGB 규칙  (0) 2022.01.11
python 함수의 생성과 호출  (0) 2022.01.11

댓글