새내기 - 파이썬 여기. Codingbat에 대한 목록 작업을 연습하면서 목록과 가변 변수가 어떻게 작동하는지 이해할 수없는 행동이 있다는 것을 깨달았습니다. 이 범위를 벗어나 있기 때문에 그 그래서 보보 없음을 얻을 수없는 이유를 아래에있는 내 질문에 프레임 몇 Codingbat 문제에서 파생 된 샘플은 ...가변 범위 변수가 다른 범위에서 어떻게 작동하는지 이해
getManipulatedNewList (에서), newnums는 (이 맞습니까?) 파괴 그 처음.
- 내가 지금은 목록의 실제 사본이 외부 그것을 함수 를 만드는 것입니다 얻을 수 있도록하는 유일한 방법 있으리라 믿고있어
- 동일한 범위 내에서, 그래서 목록을 조작하는 기능 밖에 일어나야한다 deepcopying을 새 목록이 사용됩니다. 옳은?
다음 마지막 함수에서 무엇이 전달되는지 (whatIsThisDoing() - 매개 변수 "nums"의 첫 번째 요소와 마지막 요소로 새 목록을 만든 다음 즉시 반환 함) Bobo가 할당 됨 그 새로운 목록이 성공적으로 (그렇지 않으면 [0], 언 = 999도 보보에서 1의 값을 변경 한 것이다).
인가 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]
아직 질문을 읽지 않았습니다. 변경 가능 변수와 변경 불가능한 변수는 정확히 동일하게 동작합니다. mutables로 조금 더 많은 것을 할 수 있습니다. – timgeb
'newnums'는 파괴되지 않습니다. 'newnums'는'reverse'가'None'을 리턴하기 때문에'None'을 지정했기 때문에'None'입니다. – user2357112