2013-12-16 2 views
0

나는이 이상한 행동을 한동안 관찰 해 왔습니다. 이제 그 이유를 알고 싶습니다.Python : 목록의 요소 변경

아래 예를 참조하십시오.

누군가가 이유를 설명 할 수 있습니까? 그리고 두 번째 작업을 수행하는 첫 번째 버전과 유사한 다른 옵션이 있는지 여부를 설명 할 수 있습니까?

>>> a 
>>> [1, 0, 1, 1] 

>>> for el in a: 
     el = 1 

>>> a 
>>> [1, 0, 1, 1] 

>>> for i in range(len(a)): 
     a[i] = 1 

>>> a 
>>> [1, 1, 1, 1] 

답변

3

첫 번째 조각 :

for el in a: 

은 항목에 목록에 대한 참조하지 않은, a의 항목의 값을 가져옵니다. 따라서 재 할당하려고하면 목록에있는 항목이 아닌 el의 값만 변경하면됩니다. 이 동안

:

a[i] 

a의 상품 자체 만이 아니라 값을 가져옵니다.

a의 모든 값을 변경하려면 새 복사본을 생성하고 a에 다시 할당 할 수 있습니다 :

a = [1 for _ in a] 

이 가장 효과적인 방법입니다. 당신은 가치, 그것을 재 할당하는 인덱스 모두를 원한다면, enumerate를 사용

for index, el in enumerate(a): 
    print el #print the current value 
    a[index] = 1 #change it, 
    print el #and print the new one! 

희망이 도움이!

+0

빠른 응답이었습니다! 고마워, 그걸 몰랐어. – user1850980

+0

대단히 환영합니다!:) – aIKid

+0

음, '엘'* 항목 자체에 대한 참조입니다. 그러나 그것은 목록에있는 위치에 대한 참조가 아니며 귀하가 의미하는 바입니다. –

1

나는 일반적으로 같은 것을 사용하게 :

a = [1 for el in a] 

목록 이해가 인덱스를 피하는 목록의 항목을 업데이트 내 선호하는 방법입니다.

0

Pythons 변수는 객체의 이름이며 메모리의 위치 이름은 아닙니다. 따라서

el = 1 

el1가 될하기 가리키는 객체를 변경하지 않습니다. 대신 el은 이제 1 개체를 가리 킵니다. 목록의 내용은 전혀 수정되지 않습니다. 이를 위해 직접 목록을 수정해야합니다.

0

빠른 열거 형은 요소의 불변 복제본을 제공하므로 색인 반복 방법보다 속도면에서 유리합니다. listname[<index>] 실제로 baseaddress+index*offset 같이

for i in range(len(a)): 
     a[i] = 1 

로 메모리 위치의 값을 수정

for el in a:# el is immutable 

. 인덱스가 0으로 시작하는 이유 중 하나