2011-09-04 8 views
64

나는 findUniqueWords이 정렬 된 결과임을 확인했습니다. list. 그러나 returnlist이 아니므로 그 이유는 무엇입니까?왜 "return list.sort()"는 목록이 아닌 None을 반환합니까?

def findUniqueWords(theList): 
    newList = [] 
    words = [] 
    # Read a line at a time 
    for item in theList: 
     # Remove any punctuation from the line 
     cleaned = cleanUp(item) 
     # Split the line into separate words 
     words = cleaned.split() 
     # Evaluate each word 
     for word in words: 
      # Count each unique word 
      if word not in newList: 
       newList.append(word)  
    answer = newList.sort() 
    return answer 
+0

것은 내가 토륨하지 않습니다 값은 하지deep copy, 그래서 평소와 같이 목록에 포함 된 요소의 측면 effecty 작업에 대한주의입니다 잉크를 사용하면 항목을 여러 번 문자열로 바꿔야합니다. 일단 정상적으로 완료되면 청소를위한 입력에서이를 수행하는 것이 더 깔끔합니다. – Ben

+0

어리석은 생각이지만, 고유 항목 목록을 원한다면 왜 세트로 변환하지 않으시겠습니까? 그런 다음 필요할 경우 목록으로 다시 변환 할 수 있습니다. 'theSet = 세트 (theList)는' 그리고 당신은 완료, 당신은 단지 목록에 다시 캐스팅해야합니다 'theList = 목록 (theSet가)' 가 완료. 쉬운. – runlevel0

답변

78

list.sort은 목록을 제자리에 정렬합니다. 즉, 새 목록을 반환하지 않습니다. 다만 문제는 여기에있다

newList.sort() 
return newList 
+0

'return sorted (newList)'가 짧습니다. 변수가 로컬이기 때문에 여기서는 중요하지 않지만 일부 경우에는 내부 정렬이 공유 변수를 변경할 수 있습니다. –

-6

반환 값에 중점을두고 파이썬 sort 함수에 대한 설명서를 다시 읽으십시오.

+11

-1. 질문을 다시 읽으십시오. 그는 "왜?"라고 물었다. 파이썬 개발자는 아마도 이유가 있습니다. 문서에는 기능의 설계 선택에 대한 동기 부여는 포함되지 않고 기능의 동작 만 포함됩니다. – Tarrasch

75

쓰기 :

answer = newList.sort() 

sort 정렬 된 목록을 반환하지 않습니다; 오히려 목록을 정렬합니다.

사용 :

answer = sorted(newList) 
10

파이썬은 습관적 아이디어는 그것이 돌연변이 된 사실을 암시하는 것으로, 기능과 데이터를 변이 방법에서 None 같은 list.sort, list.appendrandom.shuffle를 반환합니다.

iterable을 가져 와서 항목의 정렬 된 새 목록을 반환하려면 sorted 내장 함수를 사용하십시오.

44

Here은 Guido van Rossum의 전자 메일로 python의 개발자 목록에서 왜 객체에 영향을주는 작업에 self을 반환하지 않고 새로운 것을 반환하지 않기로 결정했는지 설명합니다.

x.compress().chop(y).sort(z) 
: 하나의 개체에 대한 부작용 일련의이 같은 체인 될 수 이것은 코딩 스타일에서 비롯됩니다 (여러 다른 언어에서 인기있는, 내가 특히 리스프 환락을 생각 )

나는 체인이 가독성에 위협을 형성 찾을

x.compress() 
    x.chop(y) 
    x.sort(z) 

와 같은 것

; 독자는 독자가 각 방법을 잘 알고 있어야한다고 요구합니다. 두 번째 형식을 사용하면 이러한 각 호출은 동일한 개체에서 작동하므로 클래스와 메서드를 매우 모르는 경우에도 두 번째 및 세 번째 호출이 에 적용됨을 이해할 수 있습니다 x (모든 부작용에 대한 호출이 이루어짐), 에 대한 호출이 아닙니다. 일종의 방법 (또는 "멤버 함수 :

y = x.rstrip("\n").split(":").lower() 
+17

즐겁게'split (":"). lower()'는 잘못된 체인입니다. 왜냐하면'split'은'lower' 메서드가없는리스트를 반환하기 때문입니다. – SuperBiasedMan

7

파이썬 종류의 두 종류가 있습니다

나는 문자열 처리 작업과 같은 새로운 값을 반환 작업에 체인을 예약하고 싶습니다 ") 및 종류 입니다.sort 메소드는 객체의 내용에 대해 작동합니다. - 으로 생각하고 객체가 자체를 재주문하려고하는 액션. 정렬 함수는 오브젝트로 표시된 데이터에 대해 조작이며 같은 내용의 새 오브젝트를 정렬 된 순서로 리턴합니다.

라는 정수의 목록을 감안할 때 l 우리가 l.sort()를 호출하는 경우 목록 자체가 다시 정렬됩니다

>>> l = [1, 5, 2341, 467, 213, 123] 
>>> l.sort() 
>>> l 
[1, 5, 123, 213, 467, 2341] 

이 메소드는 반환 값이 없습니다. 그러나 l.sort()의 결과를 할당하려고하면 어떻게 될까요?

>>> l = [1, 5, 2341, 467, 213, 123] 
>>> r = l.sort() 
>>> print(r) 
None 

은 이제 실제로 아무 것도 아닙니다. 프로그래머가 파이썬에서 부재 한 후에 잊어 버릴 수있는 이상하고 다소 성가신 세부 사항 중 하나입니다. (이 이유는 제가 이것을 작성한 이유입니다. 그래서 다시 잊지 마십시오).

기능 sorted(), 다른 한편으로는, l의 내용에 아무것도하지 않습니다,하지만 반환하는 새로운 l 같은 내용 목록을 분류 :

>>> l = [1, 5, 2341, 467, 213, 123] 
>>> r = sorted(l) 
>>> l 
[1, 5, 2341, 467, 213, 123] 
>>> r 
[1, 5, 123, 213, 467, 2341] 

하면 반환주의하십시오

>>> spam = [8, 2, 4, 7] 
>>> eggs = [3, 1, 4, 5] 
>>> l = [spam, eggs] 
>>> r = sorted(l) 
>>> l 
[[8, 2, 4, 7], [3, 1, 4, 5]] 
>>> r 
[[3, 1, 4, 5], [8, 2, 4, 7]] 
>>> spam.sort() 
>>> eggs.sort() 
>>> l 
[[2, 4, 7, 8], [1, 3, 4, 5]] 
>>> r 
[[1, 3, 4, 5], [2, 4, 7, 8]] 
관련 문제