Первое, что нужно понять, - почему этот метод setEqual
не может работать: вам нужно знать , как работают идентификаторы . (Чтение этой ссылки должно быть очень полезным.) Для краткого изложения с, вероятно, слишком большой терминологией: в вашей функции параметр 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 = []
Вы фактически связываете восстановление с новым объектом списка, который вы создаете. Поскольку у Python есть локальная область действия функции, 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!