2016-09-14 2 views
0

은 내가 append() 기능에 대한 이상한 행동이 생각 나는 발생했습니다, 나는 다음과 같은 간단한 코드를 복제하는 데 성공했습니다파이썬 추가 동작이 이상합니까?

:이 코드는 결과 기대

plugh1 = [] 
plugh2 = [] 
n = 0 
while n <= 4: 
    plugh1.append(n) 
    plugh2.append(plugh1) 
    n = n+1 
print plugh1 
print plugh2 

plugh1 = [1, 2, 3, 4] 
plugh2 = [[1], [1, 2], [1, 2, 3, ], [1, 2, 3, 4]] 

하지만 실제 결과는 다음 루프 실행되는

plugh1 = [1, 2, 3, 4] 
plugh2 = [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]] 

모든 배열 요소로 대체 ​​될 때마다 plugh1의 값.

비슷한 질문이 있지만 해결책은 중첩 함수와 관련이 있으며 이러한 호출 외부에서 변수를 정의하는 것과 관련이있는 것 같습니다. 이것은 훨씬 간단합니다. 내가 뭘 놓치고 있니?

답변

2

을 당신은 당신이 실제로 첫 번째 목록에 대한 참조를 추가하는

plugh2.append(plugh1) 

을 할 때, 목록은 현재로 . 따라서 다음에 당신은

plugh1.append(n) 

당신이 plugh2 내부의 내용을 변경을 할뿐만 아니라.

목록을 복사하면 이후에 변경되지 않도록 목록을 복사 할 수 있습니다.

plugh2.append(plugh1[:]) 
0

이 :

plugh2.append(plugh1) 

plugh1에 대한 참조가 아닌 사본을 추가합니다. 즉, 향후 업데이트가 plugh2에 반영됩니다. 복사본이 필요한 경우 여기를 참조하십시오. https://docs.python.org/2/library/copy.html

+5

'plugh2.append (plugh1 [:])' – sberry

+0

도 우수 할 수 있습니다. newb를 도와 주셔서 감사합니다. 건배 –

1

이렇게되는 이유는 목록 자체는 복사하지 않고 목록에 대한 참조 만 복사하기 때문입니다. 다음을 실행 해보십시오.

print(pligh2[0] is pligh2[1]) 
#: True 

목록의 각 요소는 모두 동일한 개체이기 때문에 다른 모든 요소가 "있습니다". 당신이 자신을 나열을 복사하려면

, 시도 :

plugh2.append(plugh1[:]) 
# or 
plugh2.append(plugh1.copy()) 
관련 문제