2017-12-04 35 views
1

새내기 - 파이썬 여기. Codingbat에 대한 목록 작업을 연습하면서 목록과 가변 변수가 어떻게 작동하는지 이해할 수없는 행동이 있다는 것을 깨달았습니다. 이 범위를 벗어나 있기 때문에 그 그래서 보보 없음을 얻을 수없는 이유를 아래에있는 내 질문에 프레임 몇 Codingbat 문제에서 파생 된 샘플은 ...가변 범위 변수가 다른 범위에서 어떻게 작동하는지 이해

getManipulatedNewList (에서
  1. ), newnums는 (이 맞습니까?) 파괴 그 처음.

  2. 내가 지금은 목록의 실제 사본이 외부 그것을 함수 를 만드는 것입니다 얻을 수 있도록하는 유일한 방법 있으리라 믿고있어

    - 동일한 범위 내에서, 그래서 목록을 조작하는 기능 밖에 일어나야한다 deepcopying을 새 목록이 사용됩니다. 옳은?

  3. 다음 마지막 함수에서 무엇이 전달되는지 (whatIsThisDoing() - 매개 변수 "nums"의 첫 번째 요소와 마지막 요소로 새 목록을 만든 다음 즉시 반환 함) Bobo가 할당 됨 그 새로운 목록이 성공적으로 (그렇지 않으면 [0], 언 = 999도 보보에서 1의 값을 변경 한 것이다).

왜 그 작업을 수행하지만, getManipulatedNewList는() newnums를 파괴?

인가 newnum을 익명 목록이 반환되는 것과 같은 방식으로 전달할 수있는 방법이 있으므로 파괴되지 않습니까?

(아니면 내가 여기에 오해 오전,

import copy 

def getManipulatedNewList(nums): 
    # Create new list 
    newnums = copy.deepcopy(nums) 

    # For example only; assume many, more complex list manipulations 
    # occur here 
    newnums = newnums.reverse() 

    # Return the newly-created list reference (doesn't work.) 
    return newnums 


def manipulateList(nums): 
    # For example only; assume many, more complex list modifs 
    # occur here 
    nums = nums.reverse() 

    # Nothing to return 


def whatIsThisDoing(nums): 
    # This actually returns something! 
    # Why, though? It's creating the new list in this function too. 
    return [nums[0], nums[-1]] 

if __name__ == '__main__': 
    arr = [1,2,3] 
    print(arr) 
    print("---") 

    bobo = getManipulatedNewList(arr) 
    print(arr) # Shouldn't be touched, as expected 
    print(bobo) # newnums was destroyed so bobo is None 
    print("---") 

    # Is this the only good solution to working with mutable vars? 
    bobo = copy.deepcopy(arr) 
    manipulateList(bobo) 
    print(bobo) 

    # Why does this work? 
    bobo = whatIsThisDoing(arr) 
    print(bobo) 
    print("---") 

    arr[0] = 999 
    print(bobo) # bobo[0] isn't changed, so it's not referencing arr[0] 
+1

아직 질문을 읽지 않았습니다. 변경 가능 변수와 변경 불가능한 변수는 정확히 동일하게 동작합니다. mutables로 조금 더 많은 것을 할 수 있습니다. – timgeb

+0

'newnums'는 파괴되지 않습니다. 'newnums'는'reverse'가'None'을 리턴하기 때문에'None'을 지정했기 때문에'None'입니다. – user2357112

답변

3

번호 :)하시기 바랍니다 어떤 이유 당신이이 reverse에서 반환 무엇 때문에 아무도 없다 얻을; 그 방법은 제자리에서 작동합니다. 이 문제는 범위와 관련이 없으며 나머지 오해는 그로부터 비롯됩니다.

+0

감사합니다. 어리석은 실수 였고 더 복잡한 방법이 아니 어서 기뻤습니다. – Gee