2010-12-13 6 views
2

받은 과제에 이상한 문제가 있습니다. 우리는 행렬 클래스를 구현해야합니다. 글쎄, 그리 어렵지는 않지만 파이썬은 내가 말한대로하지 않을 것이다. 그러나 나는 설명이있을 것이라고 확신한다.목록/매트릭스가 올바른 값을 저장하지 않습니다.

다음 코드에서는 목록에 제공된 값을 매트릭스에 저장하려고합니다. 내가 행렬을 인쇄하려고 할 때

class simplematrix: 
    matrix = [[]] 
    def __init__(self, * args): 
     lm = args[0] 
     ln = args[1] 
     values = args[2] 
     self.matrix = [[0]*ln]*lm 

     for m in range(lm): 
      for n in range(ln): 
       self.matrix[m][n] = values[(m*ln)+n] 

vals = [0,1,2,3,4,5] 
a = simplematrix(2,3,vals) 

, 내가 얻을 것으로 기대 [[0,1,2], [3,4,5], 내가 손으로 그것을 실행하면 내가 조각에, 얻을 수있는 종이. 파이썬에서 행렬을 인쇄하면 [[3,4,5], [3,4,5]]가됩니다. 파이썬이 왜 이런 식으로 행동하는지, 아니면 어리석은 실수를 저에게 가한 사람은 누구입니까? :)

답변

2

문제는 [[0]*ln]*lm입니다. 결과는 동일한 목록에 대한 lm의 참조로 구성되므로 한 행을 수정하면 모든 행이 변경된 것처럼 보입니다.

시도 :

self.matrix = [[0]*ln for i in xrange(lm)] 
+0

아 좋아요. 빠른 답변과 설명에 감사드립니다. 같은 목록에 여러 번 참조하는 것을 사용하는 것을 볼 수 없으므로 나 자신을 알아 내지 못했을 것입니다. 다시 한번 감사드립니다. – Casper

+1

대단히 반갑습니다. 어느 누구에게도 이것으로 모든 사람이 잡히게됩니다. – NPE

1

문제는 self.matrix = [[0]*ln]*lm 당신에게 lm 별도의 하위 목록의 목록,하지만 하나의 동일한 목록 [[0]*ln]lm 참조 목록을 제공하지 않습니다.

은 (파이썬 2에 있다면, 대신 xrange(lm) 사용)

self.matrix = [[0]*ln for i in range(lm)] 

을보십시오.

+0

xrange와 range의 차이점은 무엇입니까? – Casper

+0

xrange는 필연적으로 목록 요소를 저장하기 때문에 목록 구조가 큰 데이터를 사용하는 경우 메모리가 많이 사용되지 않습니다. 실제로 xrange가 목록이 아닌 xrange 객체를 반환한다는 점에서 좀 더 복잡하지만, 알아야 할만큼 메모리 사용을 줄이기위한 것입니다. – TartanLlama

2

팀 및 AIX에 의한 답변이 당신의 실수를 수정하지만 그 단계도 필요하지 않습니다, 당신은 할 수있는 지능형리스트 사용하여 한 줄에 모든 것을 :

self.matrix = [[values[m*ln+n] for n in range(ln)] for m in range(lm)] 

은 또한 말할 수 있습니다 :

vals = range(6) 

당신이 이미 가지고있는 반대. 이렇게하면 코드가 정리되어 더 Pythonic이됩니다.

+0

와우, 그건 작지만 훨씬 좋네요. 팁 고마워. – Casper

+0

문제 없습니다. 파이썬의 아름다움입니다. – TartanLlama

관련 문제