2013-04-20 2 views
2

많은 파이썬 목록 메서드가 작동하고 None (내 머리 꼭대기에서 벗어나, insert, sort, reverse)을 반환합니다.목록 할당은 어디로 이동합니까?

그러나 자주 저를 좌절시키는 하나의 행동이 있습니다. 나는 일반적으로 객체를 반환하는 새 목록을 작성하고, 동시에 거기에 삽입하면 새 목록이 "사라"그래서 튜플을 수정하려면

mytup = (0, 1, 2, 3, 4) 
print mytup # (0, 1, 2, 3, 4) 
mylist = list(mytup) 
print mylist # [0, 1, 2, 3, 4] 
newlist = list(mytup).insert(0, 10) 
print newlist # None 

, 그것은 더 라인이 필요합니다

newlist = list(mytup) 
newlist.insert(0, 10) 
print newlist # [10, 0, 1, 2, 3, 4] 

그래서 나는 두 가지 질문이 있습니다

  1. 내가 목록 생성자를 호출 할 때, 그것은 개체를 반환라고하는 것이 정확하지만 나는 그것에 방법 목록 생성자를 호출 할 때, 메서드는 0123으로 반환 값을 "무시"합니다.? 다시, 목록 은 어디로 가야합니까?
  2. 튜플에 삽입하고 한 줄로 목록을 반환하는 방법이 있습니까? 나는 코드 골프를하려고하지 않고, 두 라인이 논리적으로 분리되어 있다고 생각하지 않는다.
+1

나는 한 줄에 넣는 것이 좋지 않을 것이라고 주장합니다. 그것들은 분리 된 작업입니다. 왜 그것을 한 줄로 밀어 넣으려고합니까? –

+0

내 머리 속에는 시퀀스가있어서 그것을 수정하고 싶습니다. 목록 인 경우 직접 삽입 할 수 있습니다. 그러나 그것은 내 자신의 잘못이 아닌 튜플 일 뿐이므로 두 줄을 사용해야합니다. 그것은 내 사고 과정을 늦춰 버린다. 많은 상황에서 비슷한 동작을하는 목록 및 튜플의 결과라고 생각합니다. – Lenna

+0

리턴 값을 "대체"하지 않습니다. 무슨 일이 일어나고있는 건'list (...). insert (...)'당신이 실제로 새로 생성 된리스트의 메소드를 호출하고 있다면, 당신은 생성자의 결과를 더 이상 요구하지 않는다. 그리고 물론,이 메소드는'None'을 리턴합니다. – ubik

답변

1

첫 번째 질문에 대한 답변은 이미 제공되었습니다. 변수에 마지막 함수 호출의 결과 인 None을 할당합니다. 두 번째 질문에 대한 답이 있습니다.

오히려 인서트를 사용하는 것보다, 같은 것을 수행

newlist = [10] + list(mytup) 

이 삽입 될 수있는 요소를 함유하는 새로운 list 생성 변환 tuple 및 점포 (참조)를 list를 생성 그것을 추가한다.

물론 이것은 양쪽 끝에 삽입하려는 경우에만 작동합니다.

새 요소를 다른 곳에 삽입해야하는 경우 tuple (예 : tuple)을 조각화해야합니다. tuple의 세 번째 요소 다음에 삽입하려면 :

3

insert, sortreverse 목록에서 장소를 수정하고 None을 반환합니다. 그리고 코드에서 실제로 반환 된 값은 newlist 변수에 저장됩니다.

newlist = list(mytup).insert(0, 10)

그리고 (즉석에서 만든)이 새로 만든 목록에의 참조가 더 이상 존재하지으로 수집 된 쓰레기입니다.

In [151]: mytup = (0, 1, 2, 3, 4) 

In [152]: lis=list(mytup) #create a new list object and add a reference to this new object 

In [153]: newlist=lis.insert(0,10) #perform the insert operation on lis and store None 
            # in newlist 

In [154]: print newlist  
None 

In [155]: print lis  
[10, 0, 1, 2, 3, 4] #you can still access this list object with 
        #the help of `lis` variable. 
+0

나는 그들이 돌아온다는 것을 안다. (명확히하기 위해 편집 됨); 그러나 세 번째 과제에서 목록은 사라지고 절대 지명되지 않습니다. Q1에서 설명한대로 내 이해가 정확하다고 생각합니다. – Lenna

+0

@Lenna'newlist = list (mytup) .insert (0, 10)'의 경우, 파이썬은 먼저'list (mytup)'리스트를 만든 다음'insert' 연산을 수행하고'newlist에'None'을 저장합니다. '. 그러나 이제는 하나의 변수가 새로 생성 된리스트를 가리키고 있지 않으므로 파이썬의 가비지 컬렉터는이를 메모리에서 제거합니다. –

관련 문제