2017-10-09 1 views
0

행렬에 이름이 지정된 튜플로 채워진 이유는 무엇입니까?명명 된 튜플을 사용하여 행렬 채우기

인덱스가 잘못 삽입되었습니다.

어떻게 고칠 수 있습니까? [] * m가 동일한 목록의 m 복사본을 만들기 때문에

from collections import namedtuple 

Point = namedtuple('Point', ['x', 'y']) 
m, n = 3, 3 
matrix = [[None] * n] * m 
for i in range(m): 
    for j in range(n): 
     matrix[i][j] = Point(i, j) 
for row in matrix: 
    print(row) 

#>>Output 
#[Point(x=2, y=0), Point(x=2, y=1), Point(x=2, y=2)] 
#[Point(x=2, y=0), Point(x=2, y=1), Point(x=2, y=2)] 
#[Point(x=2, y=0), Point(x=2, y=1), Point(x=2, y=2)] 

결과는 (

#>>Output 
#[Point(x=0, y=0), Point(x=0, y=1), Point(x=0, y=2)] 
#[Point(x=1, y=0), Point(x=1, y=1), Point(x=1, y=2)] 
#[Point(x=2, y=0), Point(x=2, y=1), Point(x=2, y=2)] 

답변

2

이상이어야한다 그들은 같은 목록을 참조하고 있습니다). 그래서 당신이 그들 중 하나를 바꿀 때, 그것들 모두가 바뀝니다. 결국 마지막 행은 이전 행에 채웠던 값을 덮어 씁니다.

초기화를 matrix = [[[None] for i in range(n)] for j in range(m)]으로 변경하면 정상적으로 작동합니다.

여기에 another StackOverflow answer은 2D 배열을 이렇게 초기화하는 부작용을 보여줍니다. 당신이 ID 기능을 x와 y를 인쇄 할 경우

0

나는 이유는 모르겠지만, 코드 작품 아래와하지

for k in range(m): 
    matrix[k] = [Point(k, i) for i in range(n)] 
+0

f 사용자가 m, n = 4, 3 일 때 오류가 발생합니다. – Vartan

+0

아니요. 초기화 행렬을 절대 떠나지 않습니다. 매트릭스 여전히 매트릭스 = [[None] * n] * m –

+0

미안하지만, 네 말이 맞아. – Vartan

0

, 당신은 볼 것이다 comperhensions를 사용하여 같은

from collections import namedtuple 

Point = namedtuple('Point', ['x', 'y']) 
m, n = 3, 3 
matrix = [[None] * n] * m 

for i in range(m): 
    for j in range(n): 
     p = Point(x=i, y=j) 
     matrix[i][j] = p 

     print(id(p.x)) 
     print(id(p.y)) 

시도에서 참조.

for i in range(m): 
    matrix[i] = [Point(i, j) for j in range(n)] 

for row in matrix: 
    print(row)` 
관련 문제