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



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]]

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

  • 2016년 09월 24일에 작성됨

조회수 284


Banner slack 2x iegsyt

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를 복사하는 자세한 방법은 파이썬 리스트를 복사하려면 어떻게 해야 되나요? 에서 확인하실 수 있습니다.

  • 2017년 02월 01일에 작성됨
    따뜻한 날만 일하자

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close