2009-06-10 6 views
11

"파이썬 프로그래밍"을위한 입문용 텍스트 How to think like a computer scientist을 읽었습니다.리스트에 적용된 곱 연산자 (데이터 구조)

목록에 적용 할 때 곱 연산자 (*)의 동작을 명확히하고 싶습니다.

실제 출력되는

def make_matrix(rows, columns): 
""" 
    >>> make_matrix(4, 2) 
    [[0, 0], [0, 0], [0, 0], [0, 0]] 
    >>> m = make_matrix(4, 2) 
    >>> m[1][1] = 7 
    >>> m 
    [[0, 0], [0, 7], [0, 0], [0, 0]] 
""" 
return [[0] * columns] * rows 

함수 make_matrix을 고려

[[0, 7], [0, 7], [0, 7], [0, 7]] 

make_matrix의 정확한 버전이다

def make_matrix(rows, columns): 
""" 
    >>> make_matrix(3, 5) 
    [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] 
    >>> make_matrix(4, 2) 
    [[0, 0], [0, 0], [0, 0], [0, 0]] 
    >>> m = make_matrix(4, 2) 
    >>> m[1][1] = 7 
    >>> m 
    [[0, 0], [0, 7], [0, 0], [0, 0]] 
""" 
matrix = [] 
for row in range(rows): 
    matrix += [[0] * columns] 
return matrix 

이유 이유 (9.8에서이 책에 설명 된대로)

가 ... 각 행은 다른 행의 별명이 있다는 것이다 make_matrix의 첫 번째 버전은

가 궁금 ... 실패하는 이유

[[0] * columns] * rows 

는 ... 각 행은 다른 행의 별칭입니다 ...

하지만

원인 7백45경1천5백15조5백36억9천1백36만3천2백10
[[0] * columns] 

즉 행의 각 행 [0] 다른 소자의 별명없는 이유.

답변