ABOUT ME

-

Today
-
Yesterday
-
Total
-
choco@desktop:~/tistory
$ 정보처리기사 요점정리
1과목 2과목 3과목 4과목 5과목 실기

$ Linux Kernel
Power Management DVFS
  • 파이썬에서 리스트를 함수 인자로 받는 경우 - 전역 변수의 문제
    SW개발/Python 2019. 2. 23. 15:28

    02/22


    파이썬 함수인자로서의 리스트의 문제 해결방안


    N-Queens 문제를 해결하기 위해 리스트를 함수의 인자로 받다가 재귀 함수를 작성했음에도 불구하고 DFS가 제대로 작동하지 않는 것을 발견하였다.


    디버깅을 한 결과, DFS로 상태 공간 트리의 가장 아래까지 진입했을 때, 그 위의 상태로 되돌아올 때 이전에 인수로 넣어준 리스트를 활용하는 것이 아니라 현재 변경된 상태의 리스트를 활용하는 것을 발견하였다. => 이 문제는 파이썬에서 리스트를 넘겨줄 때, 값으로 넘겨주는 것이 아니기 때문이다!


    파이썬에서 함수인자로서의 리스트는 다음과 같은 문제가 발생한다.



    alist를 함수인자로 받은 것임에도 불구하고, 함수 밖에 존재하는 alist까지 변경되었다.


    이를 해결하기 위해서는 깊은 복사를 해야 한다. 1차 배열을 사용하는 경우 배얼[:] 로만으로 복사해도 가능하지만, 2차 배열을 사용하는 경우 배열[:][:]은 깊은 복사가 되지 않는다.


    [:][:] 로 복사한 경우


    alist가 [:][:]로 복사했음에도 불구, 또 변경되었다.

    (위와 같이 인덱스 변경은 alist가 변경되었지만.... .append()는 alist를 변경시키지 않았다.)


    하지만 deepcopy를 하면 변경되지 않는다.


    1) copy module을 이용한 deepcopy 사용


    2) 복사하는 코드를 작성


    1차 배열은 [:] 만으로도 원래 배열을 변경시키지 않을 수 있다.



    => [:][:]를 했을 때, 내부의 리스트는 주소값으로 전송되는 것 같다. python tutor를 통한 내용 확인이 필요.

    'SW개발 > Python' 카테고리의 다른 글

    pyinstaller error (matplot lib 버전 문제)  (0) 2020.12.03
    Python 숏코딩을 위한 팁 정리  (2) 2020.01.23
    Python 프로파일링  (0) 2019.04.11

    댓글

Designed by Tistory.