먼저 이해해야 할 것은 setEqual
메서드가 작동하지 않는 이유입니다. how identifiers work을 알아야합니다. (링크를 읽는 것은 매우 도움이 될 것입니다.) 너무 많은 용어가 포함 된 빠른 요약을 보려면 함수에서 매개 변수 restore
이 개체에 바인딩되어 있고 해당 식별자를 =
연산자로 다시 바인딩하는 것일뿐입니다. 다음은 식별자 restore
을 사물에 묶는 몇 가지 예입니다.
# Bind the identifier `restore` to the number object 1.
restore = 1
# Bind the identifier `restore` to the string object 'Some string.'
# The original object that `restore` was bound to is unaffected.
restore = 'Some string.'
그래서, 당신이 말하는 함수에 :
restore = []
당신은 실제로 당신이 만드는 새로운 목록 개체 복원 바인딩된다. 파이썬은 함수 - 로컬 범위 지정을하기 때문에 예제에서 restore
은 함수 로컬 식별자 restore
을 새 목록에 바인딩합니다. 복원으로 setEqual
으로 전달되는 내용은 변경되지 않습니다. 예를 들어,
test_variable = 1
setEqual(test_variable, [1, 2, 3, 4])
# Passes, because the identifier test_variable
# CAN'T be rebound within this scope from setEqual.
assert test_variable == 1
조금 단순화, 당신은 단지 현재 실행 범위에 식별자를 바인딩 할 수 있습니다 - 당신이 그 기능 이외의 범위에 영향을 def set_foo_to_bar(foo, bar)
같은 기능을 쓸 수 없다. @Ignacio에 따르면 복사 기능과 같은 것을 사용하여 현재 범위에서 식별자를 다시 바인딩 할 수 있습니다.
original = [1, 2, 3, 4]
backup = list(original) # Make a shallow copy of the original.
backup.remove(3)
assert original == [1, 2, 3, 4] # It's okay!
이것을 사용하려면 '가져 오기 사본'을 잊지 마세요. – Morlock