파이썬 열 기준으로 정렬 질문

조회수 2281회

import operator

def sort_table(table, col):
  return sorted(table, key=operator.itemgetter(col))

x = [
      [4, 6, 3],
      [7, 5, 2],
      [1, 3, 8]
      ]

y = sort_table(x[0:3], 0)

for i in range(3):
        for j in range(3):
            print x[i][j],'\t',
        print('\n')

for i in range(3):
        for j in range(3):
            print y[i][j],'\t',
        print('\n')

x[0][0]=y[0][0]
x[1][0]=y[1][0]
x[2][0]=y[2][0]

print x

결과값이

[[1, 6, 3], [1, 5, 2], [1, 3, 8]]

으로 나오는데

[[1,6,3],[4,5,2],[7,3,8]]

으로 나와야 하는거 아닌가요?

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 전형적인 shallow copy 문제입니다. x와 y는 서로 연관이 없는 듯 보이지만 사실 x와 y는 참조 관계입니다. 따라서 x를 변경할 경우, y도 그 영향을 받을 수 있으며, 그 반대도 마찬가지입니다.

    def sort_table(table, col):
      return sorted(table, key=operator.itemgetter(col))
    
    x = [ [4, 6, 3], [7, 5, 2], [1, 3, 8] ]
    
    y = sort_table(x[0:3], 0)
    
    print "original:"
    print y
    
    print "after x[0][0]=y[0][0]:"
    x[0][0]=y[0][0]
    print y
    

    실행결과:

    original:
    [[1, 3, 8], [4, 6, 3], [7, 5, 2]]
    after x[0][0]=y[0][0]:
    [[1, 3, 8], [1, 6, 3], [7, 5, 2]]
    

    이 코드를 실행하면 감이 잡히실텐데요. x에 값을 변경했을 뿐인데 y[1][0]도 함께 바뀌어 있습니다. 올리신 코드를 실행했을 때 [[1,6,3],[4,5,2],[7,3,8]]가 나오려면 함수 sort_table를 다음과 같이 바꿔주세요.

    from copy import deepcopy
    
    def sort_table(table, col):
      return deepcopy(sorted(table, key=operator.itemgetter(col)))
    

    여기서 쓰인 deepcopy 함수는 x와 y의 고리를 끊어 더 이상 참조가 일어나지 않게 막습니다. list를 복사하는 자세한 방법은 파이썬 리스트를 복사하려면 어떻게 해야 되나요? 에서 확인하실 수 있습니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자

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

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

(ಠ_ಠ)
(ಠ‿ಠ)