2011-12-22 3 views
3

OK, 먼저 다음 코드를 체크 아웃 : 나는 누구의 항목뿐만 아니라 단지 Demo1Demo2 같은 모든 목록이며, 목록을 작성해야목록에있는 목록에 파이썬으로 항목을 추가하려면 어떻게합니까?

Demo1: [[1], []] 
Demo2: [[1], [1]] 

: 여기

Demo1 = [[], []] 
Demo2 = [[]] * 2 
Demo1[0].append(1) 
Demo2[0].append(1) 
print "Demo1: ", Demo1 
print "Demo2: ", Demo2 

그리고 출력의 물론 내 스크립트에서 Demo2을 사용했는데 위 코드에서 볼 수있는 이유를 발견 할 때까지 문제가 계속 발생했습니다. 그렇다면 왜 이런 일이 발생 했습니까? 대부분의 경우, 길이가 각각 다를 때마다 Demo2을 사용하여리스트를 작성하지만 목록에있는 항목을 별도의 목록에 추가하면 어떻게 될까요?

+0

나는 인쇄 반복 "Demo2을", Demo2 몇 번 내가 온라인 첫 번째 줄이 작동하지 않는 것을 발견, 이후의 라인이 작동, 응 – cherhan

+0

다음 주간 뉴스 레터에 있어야 이상한 : – Kirill

답변

4

첫 번째 질문 : Demo2의 경우 목록에 두 개의 동일한 개체 사본이 포함되어 있기 때문에 상황이 발생합니다. 아래 예제를 보면 Demo1은 다르지만 Demo2는 일치한다는 것을 알 수 있습니다.

>>> Demo1 = [[], []] 
>>> Demo2 = [[]] * 2 
>>> print id(Demo1[0]), id(Demo1[1]) 
33980568 34018800 
>>> print id(Demo2[0]), id(Demo2[1]) 
34169920 34169920 
두 번째 질문에 대한

는 : 새 목록을 n 번을 만들기보다는 동일한 목록을 n 번 중복 될하기 위해, [[] for i in xrange(n)] 같은 지능형리스트를 사용할 수 있습니다.

예 :

>>> Demo2 = [[] for i in xrange(2)] 
>>> Demo2 
[[], []] 
>>> Demo2[0].append(1) 
>>> Demo2 
[[1], []] 
+0

고마워, 문제 해결. 아직도 이런 식으로 설계된 이유는 아직 이해가되지 않습니다. 나에게'Demo2 = [[]] * 2'를 사용하여 중복 된 내용을 만드는 것은 의미가 없다. – Shane

2

Demo2이 동일한리스트에 두 참조를 포함하는리스트이다.

Demo2 = [[] for x in range(2)] 
관련 문제