2012-08-12 4 views
0

"컴퓨터 과학자처럼 생각하는 법 : Python 2nd Edition 문서 학습"을 읽었습니다. Chapter 9 끝 부분에이 연습 11이 있으며, doctest 패스를 만들기 위해 파이썬 코드를 작성하도록 요청합니다.파이썬에서 중첩 목록을 복제하는 방법은 무엇입니까?

내 초기 솔루션 :

def add_column(matrix): 
""" 
    >>> m = [[0, 0], [0, 0]] 
    >>> add_column(m) 
    [[0, 0, 0], [0, 0, 0]] 
    >>> n = [[3, 2], [5, 1], [4, 7]] 
    >>> add_column(n) 
    [[3, 2, 0], [5, 1, 0], [4, 7, 0]] 
    >>> n 
    [[3, 2], [5, 1], [4, 7]] 
""" 
result = matrix[:] 
for index in range(len(matrix)): 
    result[index] += [0] 
return result 


if __name__ == "__main__": 
    import doctest 
    doctest.testmod() 

그러나이 코드는 두 번째 시험을 통과하지 않았다. 지금

result[index] = result[index] + [0] 

하고 코드 모든 테스트를 통과 : 나는 다음 for 루프 의 몸을 바 꾸었습니다. 하지만 코드에서 이러한 변화가 어떻게 문제를 해결했는지 이해할 수 없습니다. 내가 result[index] = result[index] + [0]result[0] += [0]의 명시적인 형태라고 생각했는데, 왜 그런 행동이 다른가요?

솔루션에서 제공하는 코드에 대한 내 대답을 비교 한 결과, 목록 복제 방법에 문제가있는 것 같습니다. 솔루션에서 다음과 같이 처리했습니다 : result = [d[:] for d in matrix],이 경우 루프의 내 초기 루프가 작동합니다. 하지만 result = matrix[:]이 (가) 작동하지 않는 이유는 무엇입니까? 새 객체가 아닌 별칭을 만드나요?

또한 누군가가 [d[:] for d in matrix]이 구문 분석되는 방법을 설명 할 수 있습니까? 이전에 루프에 을 사용하는 방법을 본 적이 없으며 수업에서 설명/시연되지 않았습니다.

목록은 다음과 같은 이유로 복제되지 않는

답변

0

:

result = matrix[:] 

참으로 목록을 복사 않는다; 목록 을 복사하지 않았습니다. 파이썬은리스트 항목을 참조로 처리하므로, resultmatrix이 다른 목록이라 할지라도 result[0]matrix[0]은 여전히 ​​같은 목록 객체를 가리킬 것입니다.

[d[:] for d in matrix]matrix을 반복하고 새 목록에서 해당 요소에 대한 참조를 사용하지 않고 각 요소의 복사본을 만들기 때문에 기본 목록과 목록 요소를 모두 복제합니다.

는 또한 그것뿐만 아니라 dicts을 처리하기 때문에 특히 유용 copy 모듈을 사용할 수 있으며, copy.deepcopy 당신은 알 수없는 깊이의 다차원 목록을 복제 할 수 있습니다 : http://docspy2zh.readthedocs.org/en/latest/library/copy.html (그러나 공평을 그 범위를 벗어나면 여기서 무엇을 배우려고하는지).

'+ ='와 '= ... + ...'의 차이는 약간 놀랍다 고 고백합니다. 이와 같은 상황에서 나는 result[index].append(0)을 사용하는 경향이 있는데, 이는 그 모호함을 피할 것입니다. 그러나 그것은 물론 답이 아닙니다.

관련 문제