0

具体来说,我想创建一个列表的备份,然后对该列表进行一些更改,将所有更改附加到第三个列表,然后在进行进一步更改之前使用备份重置第一个列表等,直到我完成进行更改并希望将第三个列表中的所有内容复制回第一个列表。不幸的是,似乎每当我对另一个函数中的第一个列表进行更改时,备份也会更改。使用original = backup效果不太好;也没有使用

def setEqual(restore, backup):
    restore = []
    for number in backup:
        restore.append(number)

解决我的问题;即使我成功地从备份中恢复了列表,但每当我更改原始列表时,备份仍然会发生变化。

我将如何解决这个问题?

4

2 回答 2

8

你想要copy.deepcopy()这个。

于 2010-03-16T23:27:17.340 回答
5

首先要了解的是为什么该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 

Simplifying a bit, you can only bind identifiers in the currently executing scope -- you can never write a function like def set_foo_to_bar(foo, bar) that affects the scope outside of that function. As @Ignacio says, you can use something like a copy function to rebind the identifier in the current scope:

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!
于 2010-03-17T00:04:03.873 回答