2014-03-27 2 views
0

비톤을 사용하여 목록을 만들고 싶었는데 두 가지 방법이 있습니다.목록 목록에서 항목을 편집 할 때 문제가 발생했습니다.

l = [] 
l_in = [] 
for j in range(2): 
    l_in.append("1") 
print l_in 
for i in range(2): 
    l.append(l_in) 
print l 

와 두 번째 방법은 다음과 같습니다 :

첫 번째 방법은 지금처럼

l = [] 
for i in range(2): 
    l.append([1]*2) 
print l 

이러한 방법은 모두

l = [['1', '1'], ['1', '1']] 

이 난 단지에 변경하려면 목록을 생성 요소 int이 목록은 (1,1) 요소를 말합니다. 내가 할 경우

l[1][1] = "Something I want to replace with" 

요소를 대체해야합니다. 이 두 번째 방법을 잘 작동합니다. 그러나 첫 번째 방법을 사용하면 (1,1)(0,1)이 모두 "Something I want to replace with"으로 변경됩니다.

누군가가 왜이 첫 번째 방법을 사용하여 출력하는지 알 수 있습니까?

답변

4

첫 번째 방법에서는 두 번째 루프에서 동일한 목록을 두 번 추가하기 때문입니다. 목록에서

for i in range(2): 
    l.append(l_in) 

이제 l의 요소를 수정 할 때마다, 당신은 실제로 수정하는 요소. 이해하기 쉬운 방법은 id()이 제공하는 값을 l의 내용으로 보는 것입니다.

>>> map(id, l) 
[32750120, 32750120] 

당신은 l의 두 요소가 동일한 ID (와 같은 메모리 주소)를 공유하는 것을 볼 수 있습니다. 둘 다 동일한 목록 l_in을 참조합니다.

쉽게 말하면 l.append(l_in[:])입니다. 여기서 [:]l_in의 복사본을 만듭니다.

l = [] 
l_in = [] 
for j in range(2): 
    l_in.append("1") 
print l_in 
for i in range(2): 
    l.append(l_in[:]) 
print l 

목록 및 생성기 포함으로 목록을 만들 수도 있습니다. 아래의 몇 가지 예 :

# empty lists.. 
>>> [[] for _ in range(4)] 
[[], [], [], []] 

# generator expression.. 
>>> list([] for _ in range(4)) 
[[], [], [], []] 

# [1, 1] for each sublist. 
>>> list([1, 1] for _ in range(4)) 
[[1, 1], [1, 1], [1, 1], [1, 1]] 

여기 년대 help()id()에 :

Help on built-in function id in module __builtin__: 

id(...) 
    id(object) -> integer 

    Return the identity of an object. This is guaranteed to be unique among 
    simultaneously existing objects. (Hint: it's the object's memory address.) 
+1

그리고 빠른 수정 (l_in [:])'l.append를 사용하는 것이다' –

+0

@A श 위니 च haudhary 추가가, 감사합니다. 그래서 인코딩 문제가 있습니다. – msvalkon

+1

의도적인데 사람들이 키보드를 사용하여 내 이름을 입력하는 것을 원하지 않습니다. : P 어쨌든 나는 이미 당신에게 +1을 주었다. –

관련 문제