2010-06-14 4 views
1

고유 한 난수 격자를 얻을 것으로 예상됩니다. 대신 각 행은 동일한 일련의 숫자입니다. 무슨 일 이니?여기 무슨 일 이니? 임의리스트의 행 반복하기

from pprint import pprint 
from random import random 

nrows, ncols = 5, 5 
grid = [[0] * ncols] * nrows 
for r in range(nrows): 
    for c in range(ncols): 
     grid[r][c] = int(random() * 100) 
pprint(grid) 

예 출력 :

[[64, 82, 90, 69, 36], 
[64, 82, 90, 69, 36], 
[64, 82, 90, 69, 36], 
[64, 82, 90, 69, 36], 
[64, 82, 90, 69, 36]] 
+0

아, 걱정 마세요. 문제는 내가 모든 행을 동일한 목록에 대한 참조로 만든 그리드를 만드는 방법이었습니다. 라인을 grid = [[0] * ncols 범위의 행 (ncols)]으로 변경하면 작동합니다. –

답변

2

나는 파이썬 당신이

grid = [...] * nrows 

내가 하드 목록을 코딩 시도하고 일을 호출 목록의 약한 사본을 사용하기 때문이라고 생각합니다 올바르게 :

>>> grid = [[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0]] 
>>> for r in range(nrows): 
...  for c in range(ncols): 
...    grid[r][c] = int(random() * 100) 
... 
>>> pprint(grid) 
[[67, 40, 41, 50, 92], 
[26, 42, 64, 77, 77], 
[65, 67, 88, 77, 76], 
[36, 21, 41, 29, 25], 
[98, 77, 38, 40, 96]] 

이것은 파이썬이리스트를 5 번 복사 할 때, 첫 번째리스트에 5 개의 포인터를 저장하는 것입니다 - 그리스트의 값을 변경할 때 실제로는 첫 번째리스트의 값을 변경하는 것입니다. 그 목록을 가리키는 모든 목록에 반영됩니다.

방법을 사용하면 모든 목록을 개별적으로 업데이트 할 수 없습니다.

대신, 좀 더 같이 귀하의 목록 세대 라인을 변경 제안 : 당신을 위해 5 개 독립적 인 목록을 작성해야합니다

grid = [[0] * ncols for row in range(ncols)] 

합니다.

관련 문제