2008-10-03 5 views
7

나는 목록을 지울 수 없다는 것을 성가 시게 느낀다. 이 예에서 :목록 지우기

a = [] 
a.append(1) 
a.append(2) 

a = [] 

I는 빈리스트, 그 메모리의 다른 위치에있는리스트의 새로운 인스턴스를 생성하고, 그래서이 참조하는 데 사용할 수 없다 초기화 번째 먼저 비효율적 인 것은 말할 것도 없습니다.

for i in range(len(a)): 
    a.pop() 

이이 문제를 해결하는 더 나은 방법이 꽤하지만 장황한 것 : 나는 같은 포인터를 유지으로 볼 수

수있는 유일한 방법은 다음과 같은 일을하고 있습니까?

+0

"메모리가 다른 곳에서 확장하므로 첫 번째 참조에 사용할 수 없습니다"이것은 파이썬 컨텍스트에서는 거의 의미가 없습니다. 어쩌면 C++에서는 가능하지만 파이썬에서는 그렇지 않을 수 있습니다. –

+0

나는 다른 객체 내에서이 객체에 대한 참조가 있으면 '새로운'이 처음에는 다른 객체로 바뀌므로이 동일한 참조를 사용하여 새 객체를 수정할 수 없다는 것을 지적하고있었습니다. 파이썬은 여전히 ​​포인터와 메모리 관리의 개념을 가지고 있습니다. 단지 포인터를 숨 깁니다. – Dan

+0

"새로운 '지금은 처음과는 다른 것"절대적으로 사실이지만이 문제가있는 상황을 볼 수는 없습니다. 보다 완벽한 코드 예제가 실제로 중요한 부분을 설명하는 데 도움이 될 수 있습니다. –

답변

26

당신이 찾고있는 :

del L[:] 
+2

마찬가지로 할 수 있습니다 L [:] = [] – Moe

3

난 당신이 대신 같은 "포인터"의 메모리에 비어있는 새 목록을 참조하고 있다는 사실에 대해 걱정하는 이유를 모르겠어요.

귀하의 다른 목록은 조만간 수집 될 것이며 고수준 쓰레기 수거 언어에서 일하는 것에 대한 큰 특혜 중 하나는 일반적으로 이와 같은 것에 대해 걱정할 필요가 없다는 것입니다.

+1

그는 목록이 비어 있음을 알아야하는 프로그램의 다른 부분에있는 목록에 대한 참조를 보유하고있을 수 있습니다. –

+0

어쩌면,하지만 그가 물었던 것이 아닙니다. 그는 메모리에서 특정 위치에 대한 포인터를 잃어버린 것에 대해 걱정했습니다. 이것은 파이썬에서 모호한 개념입니다. – Dana

+0

그는 나중에 논평에서 그것을 분명히했다. – tzot