Python에서 = 과 <- 의 차이

조회수 577회

Python에서 type이 list인 A와 B가 있을 때 (혹은 type이 list가 아니더라도)

A = B로 선언한뒤 뒤에 A를 만지면 B도 같이 변하나요?

또한 그렇다면 B를 변하지 않게 하기 위해선 A = B 대신 A <-B 로 선언하면 되나요?

다름이 아니라 제 코드를 돌렸는데 B를 왼쪽에 (등호 좌변)에 놓은 적이 없고 A만 만졌는데 B가 변한 것 같아 질문드립니다.

3 답변

  • 파이썬의 변수는 기본적으로 주소를 저장한다고 생각하시면 됩니다

    >>> a = [1,2,3]
    >>> b = a
    

    가 되면 a에는 [1,2,3]을 참조할 수 있는 주소값이 저장되고, b에는 a에 저장된 것과 같은 주소값이 저장됩니다.

    그렇기 때문에 a.append(4)와 같은 작업을 하면 b는 a와 동일한 주소값을 저장하고 있기 때문에 ab를 출력해보면 모두 [1, 2, 3, 4]이 나오게 됩니다.

    >>> a = [1, 2, 3]
    >>> b = a
    >>> a = [1, 2, 3, 4]
    

    만약 위와 같이 하게 된다면 b는 a가 기존에 가리키고 있던 주소값을 저장하고 있지만 a에는 새로운 주소값이 저장되기 때문에 두 개가 별개로 존재하게 되죠

    만약 리스트를 포함한 보편적인 상황에서 ab를 구분하고자 한다면 다음과 같이 하면 됩니다.

    import copy
    a = [1, 2, 3]
    b = copy.deepcopy(a)
    
    >>> a
    [1, 2, 3]
    >>> b
    [1, 2, 3]
    >>> a.append(4)
    >>> a
    [1, 2, 3, 4]
    >>> b
    [1, 2, 3]
    
    • 보편적인 상황이라고 하면 안되고 list, dict, set에 한해서라고 해야 합니다. 파이썬에서 call by reference 는 변경이 가능한 상태에 한합니다. 예를들어 tuple 이나 스칼라타입들(int,float등) 은 call by value 입니다. 정영훈 2020.4.18 23:50
    • call by value인 경우에는 질문자분이 말씀하신 문제가 발생하지 않아서 별로 고민하지 않고 넘어갔는데 말씀하신대로 구분해서 알아두는 게 좋겠네요. 지적 감사합니다. HIAOAIH 2020.4.20 10:57
  • 이걸 보시죠.

    요약: 파이썬에는 <- 연산자가 없는데, 아마 <와 음수 부호-를 잘못봤겠지

  • A = B로 선언한뒤 뒤에 A를 만지면 B도 같이 변하나요?

    네.

    A = B[:] 와 같이 전체슬라이싱을 이용해 복제본을 만들어 할당하는 방식을 많이 씁니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)