2017-03-06 1 views
-1

파이썬에서 목록 내의 특정 위치에정수를 할당하려고합니다. 그러나이 값은 모든 여러 위치에 할당됩니다. 분명히 파이썬은 값이 아니라 참조로 값을 할당하고 있습니다. 왜 그런가?파이썬 목록 - 특정 목록 위치에서 값을 변경하면 여러 위치에 잘못 반영됩니다.

matrix = [[[0,0]] * (5) for _ in range(2)] 
matrix[1][3][0] = 42 

초기 :

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

실제 (할당 후) :

[ 
[[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], 
[[42, 0], [42, 0], [42, 0], [42, 0], [42, 0]] 
] 

답변

-1

범인은 [[0,0]] * (5)입니다. 이 게으른 동료는 하나의 요소 [0,0]을 생성하고 참조를 5 번 복사하여 전체 목록을 작성합니다. 특정 인덱스 위치로 값을 설정하려고 할 때이를 원자 연산으로 간주하고 행복하게 참조하면 동일한 값이 다른 위치에 나타납니다. 행렬을 생성하는

오른쪽 문되어야 다음 * 연산자는 정수 적 캐릭터와 같은 원자 값리스트를 생성하는 경우에만 사용되어야

matrix = [[[0,0] for __ in range(5)] for _ in range(2)] 

. 목록 또는 다른 객체의 목록을 만드는 것이 아닙니다.

x = [4]*100 # will create a list of number 4 repeated 100 times. 
y = [x]*100 # will create a list with reference of x repeated 100 times. Any change in x will be visible in y and vice-versa.