python : 목록에 사전 추가-동작과 같은 포인터가 보입니다.


85

파이썬 인터프리터에서 다음을 시도했습니다.

>>>
>>> a = []
>>> b = {1:'one'}
>>> a.append(b)
>>> a
[{1: 'one'}]
>>> b[1] = 'ONE'
>>> a
[{1: 'ONE'}]
>>>

여기서는 사전 'b'를 목록 'a'에 추가 한 후 사전 'a'의 키 1에 해당하는 값을 변경합니다. 어떻게 든이 변경 사항은 목록에도 반영됩니다. 목록에 사전을 추가 할 때 사전 값만 추가하지 않습니까? 목록에 사전에 대한 포인터를 추가 한 것처럼 보이므로 사전에 대한 변경 사항도 목록에 반영됩니다.

변경 사항이 목록에 반영되는 것을 원하지 않습니다. 어떻게하나요?

시간 내 주셔서 감사합니다!


체홉이 아닌 'B'사전 이 중 하나이며, 사전 B 또는 이름 'B'의 사전 . 그건 그렇고, 당신은 실수로 썼습니다 : "사전 'a'에서 키 1에 해당하는 값을 변경하고 있습니다. " 아니요, 사전 b에서. 놀랍게도 목록은 값을 보유하지 않고 객체를 보유합니다. 모든 것이 Python의 객체이기 때문입니다. 또는 더 정확하게 목록은 객체에 대한 참조를 보유합니다.
eyquem 2011 년

Chekhov 또한이 질문을 볼 수 있습니다 : ( stackoverflow.com/questions/5242933/… )
eyquem 2011 년

@eyquem 귀하의 의견에 감사드립니다. 나는 이것을 서둘러 게시하고 있었다. 죄송합니다.
neo29 2011 년

Chekhov 그것은 비난이 아니라 단지 정보였습니다. 그건 그렇고, 내 대답이 다소 유용하다면 찬성 할 수 있습니다. 또한 답변 중 하나의 답변을 "수락"하도록 선택할 수 있으며, 한 답변의 왼쪽에있는 포인트 카운터 아래에있는 갈매기 모양의 줄무늬를 클릭하면 25 점을 얻습니다. 또는 질문을 수락하지 않도록 선택할 수 있습니다.
eyquem 2011 년

답변:


140

목록 에 원래 사전에 대한 참조 가 포함되어 있다는 점에서 정확합니다 .

a.append(b.copy()) 트릭을해야합니다.

이것은 얕은 사본을 만든다는 것을 명심하십시오. 또 다른 방법은를 사용하는 것입니다 copy.deepcopy(b).


6
대박! 나는 이것에 대해 오랫동안 차단되었습니다
Yasin

2
포기하고 스택을 확인하기로 결정할 때까지 약 30 분 동안 마음이 날아갔습니다.
FlyingZebra1

35

또한 dict 와 함께

a = []
b = {1:'one'}

a.append(dict(b))
print a
b[1]='iuqsdgf'
print a

결과

[{1: 'one'}]
[{1: 'one'}]

copy ()만큼 빠른지 확실하지 않지만 deepcopy ()보다 빠릅니다. 복잡한 사전 스키마를 사용하면 dict ()가 새 사전을 생성하기 때문에 deepcopy ()에 가깝습니다.
selotec

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.