2014-04-30 3 views
1

왜 다음 코드는 두 변수를 변경 않습니다델은 왜 같은 일을하지 않습니까?

>>> a = [] 
>>> b = a 
>>> a.append(9) 
>>> a 
[9] 
>>> b 
[9] 
>>> 

그러나 del 문이 같은 효과를 얻을하지 않습니다?

>>> a = [] 
>>> b = a 
>>> del(a) 
>>> a 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'a' is not defined 
>>> b 
[] 
>>> 
+0

'del'이 무엇인지 알지 못해도 작성한 태그 wiki로 python-del 태그를 생성하지 마십시오. 객체를 삭제하지 않으며, 새 태그가 필요하지 않습니다. – geoffspear

답변

2

당신이 할 때 : 당신은 무엇을하고있는 것은 라벨 a가 다스 려하고있는 같은 객체에 레이블 b을 할당한다

a = b 

.

당신이 할 때 : 당신은 객체가 ab 모두가 가리키는 목록에 9을 추가하는

a.append(9) 

. 그것은 같은 대상이므로 동일한 결과를 보여줍니다.

당신이 할 때 : 당신은 객체가 아닌 객체 자체에 참조을 삭제하고

del a 

. 참조 인 경우 개체가 가비지 수집됩니다. 그러나 귀하의 경우 다른 참조 인 b이 있습니다. 따라서 객체는 계속 존재합니다.

0

append있어서, 상기 실물에 대해 작동하는 동안, 즉 변수 이름 참조에 대해 del 작품.

1

"변수"대신 이름과 개체로 생각하십시오.

>>> a = [] 

이렇게하면 빈 목록 개체가 만들어지고 a이라는 이름이 바인딩됩니다.

>>> b = a 

이것은 단순히 b 지금 a에 의해 명명 된 객체의 새 이름이라고 말한다. 우리는

>>> a is b 
True 

del a 우리가 이름 a을 망각하고 있다는 의미가 없다 : 그것은 더 이상 객체에 바인딩됩니다.

>>> del a 
>>> a 
Traceback (most recent call last): 
    File "<ipython-input-8-60b725f10c9c>", line 1, in <module> 
    a 
NameError: name 'a' is not defined 

하지만 당신은 더 이상에만 b이 목록 객체 a를 호출하지하고 있는지, 어떤 방식으로 객체 자체에 영향을주지 않습니다. 사물들은 당신이 그들에게 주신 이름을 신경 쓰지도 않고 심지어 알지도 못합니다. [객체가 더 이상 참조가없는 경우 가비지 수집 될 수도 약속이 없을 수도 있습니다.]

0

(이미 the other question of yours의 질문에 대답했습니다. 약간의 수정을 가해 여기에서도 사용하려고합니다 :)

del 개체를 삭제하지 않습니다. 사실 파이썬에서는 인터프리터/VM에게 파이썬이 가비지 수집 언어 (예 : Java, C#, Ruby, Haskell 등)이기 때문에 메모리에서 객체를 제거하도록 말할 수조차 없다.

대신 무엇을 del이 같은 (사전 키 또는 목록 항목과 반대로) 변수 호출 않을 때 :

del a 

그것은 단지 변수 로컬 (또는 글로벌) 제거 이다 아니요 무엇을 가리키고 있는지 (파이썬의 모든 변수는 내용 자체가 아닌 내용에 대한 포인터/참조를 가지고 있습니다). . (또는 글로벌인가 del globals()['a'])

del locals()['a'] 

그렇다면

: 주민과 전역 후드 아래에 사전 저장되어 있기 때문에 실제로 del a는 동등하다 (locals()globals() 참조) 당신은 :

a = [] 
b = a 

하면, 목록을 a에 대한 참조를 저장하고 복사하지 않고 b에 해당 참조를 복사/목록을 터치하고 개체 자체. 따라서이 두 호출 한 영향과 같은 객체 :

>>> a.append(1) 
>>> b.append(2) 
>>> a 
[1, 2] 
>>> b 
[1, 2] 
>>> a is b # would be False for 2 identical but different list objects 
True 
>>> id(a) == id(b) 
True 

(id 반환 객체의 메모리 주소)

반면 b을 삭제하면 무슨 b 지점을 만지지 관련된 어떠한 방식에 있습니다

>>> a = [] 
>>> b = a 
>>> del b # a is still untouched and points to a list 
>>> b 
NameError: name 'b' is not defined 
>>> a 
[]