2016-07-12 2 views
-1

변경 가능한 객체의 수정이 함수 외부에 반영되는 방법에 대한 많은 SO 페이지를 읽었지만 불변 객체 (분명히)는 그렇지 않습니다. 그러나 나는 두 개의 서로 다른 정렬 함수에 동일한 목록을 보내고 하나는 수정하고 다른 하나는 수정하지 않는이 코드에 조금은 당황 스럽다.파이썬 동일한리스트가 하나의 함수에 의해 변경되고 다른 함수에 의해 변경되지 않음

def bubbleSort(mylist): 
    for i in range(len(mylist)): 
      for j in range(i,len(mylist)): 
        if mylist[i] > mylist[j]: 
          mylist[i], mylist[j] = mylist[j], mylist[i] 
    return mylist 

거품 정렬() 위의처럼 호출 할 수 있습니다

bubbleSort(mylist) 

및 호출자에 반영되고 myList에의 midification으로 잘 작동합니다. 호출자에서 bubbleSort()의 반환 값을 완전히 무시할 수 있습니다.

def mergeSort(mylist): 
    listSize = len(mylist) 
    shortSize = int(listSize/2) 
    if listSize == 1: 
      return (mylist) 
    mylistLeft = mergeSort(mylist[:shortSize]) 
    mylistRight = mergeSort(mylist[shortSize:]) 
    i, j = 0, 0 
    result = [] 
    while (i < len(mylistLeft) and j < len(mylistRight)): 
      if mylistLeft[i] > mylistRight[j]: 
        result.append(mylistRight[j]) 
        j += 1 
      else: 
        result.append(mylistLeft[i]) 
        i += 1 
    result += mylistRight[j:] 
    result += mylistLeft[i:] 
    return result 

머지 소트() 여기은 위의 호출처럼 호출 할 수 없습니다. 대신에 나는 같이 호출 할 수 있습니다

newlist = mergeSort(mylist) 

myList에가 정렬되지 않은 목록이있는 동안 newlist, 내가 원하는 것을 가지고있다. 따라서 bubbleSort()은 return 문을 요구하지 않지만 mergeSort()은 그것 없이는 쓸모가 없습니다. 재귀에서 반환의 필요성을 이해하지만 호출 함수에서 반환 값을 사용하지 않아도 될 것으로 예상했습니다.

제 질문은 무엇입니까? 두 경우 모두 변수를 변경할 수 있습니까?

답변

1

mergeSort 함수는 전달 된 목록을 전혀 수정하지 않습니다. 대신 새 목록을 만듭니다.

results = []은 새로운 빈 목록을 만듭니다. 그런 다음 요소를 추가합니다. 이 중 어느 것도 당신이 전달 된 원래의 목록을 수정하지 않습니다. 그런데

편집

, "현재 위치에서"병합 정렬을 수행하기 위해 실제로 가능하다 (원래 목록을 수정하는 대신 만들어 새로운 것이지만), 조금 까다 롭습니다. 일반적인 기술로, 원래 목록을 계속 지나가고 싶지만 인덱스를 사용하여 각 재귀 호출이 작동해야하는 목록의 부분을 표시해야합니다.

+0

오. 그래서 ** mergoSort() **에서 돌아 오기 전에 * mylist = result *를 시도했습니다. 하지만 여전히 작동하지 않습니다. – DDauS

+0

또한 원래 목록을 수정하지 않습니다. 이것은 변수 mylist가 가리키는 것을 변경합니다. 예를 들어,'def foo (x) : x = 5' 그리고'a = 4; foo (a)'. 그건'a'의 값을 수정하지 않습니다. – smarx

+0

좋아, 이제는 궁금 해서요, 저를 위해 좋은 지침서를 가르쳐 주시겠습니까? 더 서술적인수록 좋다. – DDauS

관련 문제