2017-05-10 4 views
1

우선이 질문이 극히 기본적인 경우 미안하지만, 저는 방금 Python으로 시작합니다.Python : 원본 객체 추가 vs 객체 사본 추가 v

파이썬 3.6이 어떻게 목록에 객체를 만들고 추가하는지 이해하는 데 문제가 있습니다. 다음 코드를 참조하십시오 : 내 원래의 생각에 따르면

a_dict=dict() 
a_list=list() 

for i in range(100): 
    a_dict['original'] = i 
    a_dict['multi'] = i*2 
    a_list.append(a_dict) 

목록의 인쇄가가는 같은

print(a_list) 
>>[{'original': 99, 'multi': 198}{'original': 99, 'multi': 198}...{'original': 99, 'multi': 198}] 

을, I = 0 -> 원래 = 0, 멀티 = 0; i = 1 -> original = 1, multi = 2; 등등 ...

그러나이 질문에 따르면 here, 파이썬의 append()는 실제 값이 아닌 객체에 포인터를 추가합니다. 그래서 (복사) 추가 내 원래의 코드에 APPEND를 (원본) 변경 :

a_dict=dict() 
a_list=list() 

for i in range(100): 
    a_dict['original'] = i 
    a_dict['multi'] = i*2 
    a_list.append(a_dict.copy()) ##change here 

를 자, 내가 원하는 결과를 얻을 :

: 이제

print(a_list) 
[{'original': 0, 'multi': 0}, {'original': 1, 'multi': 2}, {'original': 2, 'multi': 4},...]  

을, 여기에 내 질문입니다

append()는 실제로 어떻게 작동합니까? 항상 목록에는 포인터와 같은 객체가 원본에 포함되어 있습니까? 다른 유형은 어떻습니까? 내 의도가 원래 값이나 내가 사용하고있는 목록/컨테이너를 직접 엉망으로 만들지 않는다면 항상 copy()를 사용해야합니까?

희망 나는 나 자신을 충분히 설명하고 있습니다. 기본 질문 인 경우 다시 미안합니다. 감사.

+2

for 루프의 각 반복이 시작될 때 새 공백 사전을 만든 경우 코드가 더 간단 해집니다. 그러나 연결된 질문에서 이미 다루고있는 것 외에는 귀하의 질문이 무엇인지 명확하지 않습니다. –

+1

가능한 [항상 동일한 값을 추가하는 파이썬 목록] (http://stackoverflow.com/questions/35906411/list-on-python-appending-always-the-same-value) –

+0

@DanielRoseman, 예, 저는 그것이 혼란스러운 질문 인 것을 아십시오. 어쨌든, 당신은 각 루프의 시작 부분에 새 사전에 대해 옳습니다. – AirieFenix

답변

1

이것은 추가하는 개체의 변경 가능성과 관련이 있습니다. 개체를 변경할 수있는 경우 업데이트 할 수 있으며 기본적으로 .append() 함수를 사용하여 목록에 대한 참조를 추가 할 수 있습니다. 따라서 이러한 상황에서는 사본이 필요합니다.

this site에는 어떤 유형이 변경 가능한지에 대한 아주 좋은 목록이 있습니다. 그러나 일반적으로 단순한 값은 일반적으로 불변 인 반면 컨테이너 유형은 가변적 인 경향이 있습니다.