2017-02-13 6 views
1

grid = [[0]*10]*10으로 초기화 된 중첩 목록 grid의 값을 변경할 때 이상한 동작이 나타났습니다.중첩 목록에서 단일 값을 변경할 때 여러 값이 변경됨

grid = [[0]*10]*10 

grid[0][0] = 1 

for l in grid: 
    print l 

출력 :

내가 grid = [[0]*10 for x in range(10)]으로 grid을 초기화
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0] 

. 예상대로 작동했습니다.

grid = [[0]*10 for x in range(10)] 

grid[0][0] = 1 

for l in grid: 
    print l 

출력 : 이런 일이 왜

[1, 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, 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, 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, 0, 0, 0, 0] 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 

사람이 알고 있나요?

도움 주셔서 감사합니다.

답변

2

grid = [[0]*10]*10을 만들면 에 동일한 참조 ([0] 개) 목록에 대한 참조 배열을 실제로 만들고 있습니다. 따라서 하나의 참조를 통해 개체를 변경하면 목록의 모든 항목이 변경됩니다.

이것은 초보자를위한 매우 일반적인 Python 'gotcha'입니다.

+0

예 @Andrew가 맞습니다. grid = [[0] * 10 for range (10)] # 여기서 목록을 만들고 할당하는 것은 여기에 있습니다. # grid # [[0] * 10] 그리드로 –