2010-12-15 6 views
2

왜 파이썬은 다음을 수행합니까?파이썬에서 이상한 2 차원 목록 동작

>>> bla = [[]] * 5 
>>> bla[3].append("blub") 
>>> print bla 
[['blub'], ['blub'], ['blub'], ['blub'], ['blub']] 

나는 원래 목록으로 다섯 번 내용을 곱하여하고

[[], [], [], ['blub'], []] 

답변

5

이 암시 통과별로 참조 할 수 파이썬과 혼란의 공통점을한다 . 당신은 메모리에 빈리스트를 가리 키도록 이름 x을 결합

x = [] 

을 입력합니다. 당신이 다섯 가지의 목록을 가리 키도록 이름 x을 결합

x = [[]] * 5 

을 수행 할 때의 각각은 같은 빈리스트에 대한 참조입니다.

[] 어떤 변수 이름을 결합하지 않더라도,이다
>>> y = [] 
>>> x = [y]*5 
>>> x 
[[], [], [], [], []] 
>>> x[0].append(0) 
>>> x 
[[0], [0], [0], [0], [0]] 
>>> y 
[0] 

, 그것은 여전히 ​​다음 다섯 번 복사 빈리스트에 대한 참조를 생성 :이처럼 생각하는 경우에 명확하게 될 수 있습니다.

빈 목록을 x에 저장하도록 명시 적으로 구성해야합니다. 이 (copy.deepcopy는 일반적인 솔루션)이 일을 여러 가지 방법이 있지만, 나는 산뜻한가 생각 :

x = [[] for _ in range(5)] 

또는 numpy는 매우 강력한 다차원 배열을 제공하는 확장 모듈입니다.

3

를 기대 - 동일한 참조가 다섯 번 곱한 수 있도록 내부 목록, 그냥 참조입니다.

즉, 최종 목록에는 동일한 목록이 여러 번 들어있는 목록이 있습니다.

파이썬이이 주위에 쉬운 방법 :

[[] for i in xrange(5)] 

파이썬 3 :

[[] for i in range(5)] 
+0

'나는 실제로 이것을 사용하고 있지 않다'('i'는 색인으로 자주 사용되는 반면) '를 나타 내기 때문에'_ '("i"이상)을 사용하는 것이 좋습니다. – delnan