2014-11-04 1 views
-2

왜 변수를 다시 할당 할 때 파이썬의 새 값이 새 메모리에 할당됩니까? 추가 값이 목록에 추가 된 경우 수정이 발생하지 않는 이유는 무엇입니까? 그러나 현재 목록과 일부 새 목록을 다시 할당하면 새 메모 리가 할당됩니다.왜 파이썬은 새로운 할당마다 새로운 메모리를 변수에 할당합니까?

>>> a=2 
>>> id(a) 
13332800 
>>> a=a+2 # reassigning allocates new memory 
>>> id(a) 
13332752 
>>> a=[1,2,3,4] 
>>> id(a) 
139923169899008 
>>> a.append(2) # change takes in place 
>>> id(a) 
139923169899008 
>>> a=a+[3,2] # this way causes new memory allocation 
>>> id(a) 
139923169899656 

새로운 할당마다 메모리를 재 할당하는 것을 피할 수있는 방법이 있습니까?

+0

http://stackoverflow.com/q/3402679/1205368 – Salem

답변

2

파이썬은 정수가 immutable objects으로 설계되었습니다. , 당신이 그들을 (변경) 돌연변이 수 없다 그들과 함께 모든 작업은 새 정수 객체를 산출 의미 : 다른 한편으로

>>> a = 2 
>>> id(a) 
505911000 
>>> id(a + 1) 
505911016 
>>> a += 2 
>>> id(a) 
505911032 
>>> 

목록이 mutable objects 수 있도록 설계되었다. 즉, 은 새 목록 개체를 만들지 않고 콘텐츠를 변경/업데이트 할 수 있습니다. 또한 이것은 정확하게 list.append 메서드가 수행하는 것입니다. 새 오브젝트를 작성하지 않고 새 항목을 목록에 추가합니다. 그러나

이 코드는 :

a=a+[3,2] 

점에서 list.append 다릅니다 그것을 않습니다 당신이 + 연산자를 사용하기 때문에 새 목록 개체를 만듭니다. a+[3,2]a[3,2]의 조합 인 새 목록 개체를 만듭니다. 그런 다음이 새 개체를 a 이름에 할당하고 이전 목록 개체를 가리고 a이 이제 새 목록을 참조하게 만듭니다. 그래서 id(a)은 다른 번호를 반환합니다.

+0

설명해 주셔서 감사합니다. 도움이되었습니다. 그러나 이전 변수가 어떻게되는지 설명해주십시오. 그들은 메모리를 해제합니까? 그렇지 않은 경우 이러한 메모리 낭비를 피하는 가장 좋은 방법은 무엇입니까? –

+0

@BHATIRSHAD - 파이썬은 해석 언어라는 점에서 C/C++과 다르다. 즉, 사용하는 메모리를 수동으로 해제 할 필요가 없습니다. 대신 파이썬 [가비지 컬렉터] (https://docs.python.org/3.2/glossary.html#garbage-collection)는 더 이상 사용하지 않는 즉시 객체가 보유한 메모리를 자동으로 재활용합니다. 이것도 매우 효율적입니다. 게다가 정수 생성 비용은 무시할 수 있습니다. 사실, 파이썬은 리터럴에 나타나는 정수뿐만 아니라 작은 정수도 자동으로 캐시합니다. – iCodez

관련 문제