Python对象混淆:a = b,修改b和更改!

jam*_*mes 7 python variables reference

我以为我知道Python直到今晚.做这样的事的正确方法是什么?这是我的代码:

a = ["one", "two", "three"]
b = a  # here I want a complete copy that when b is changed, has absolutely no effect on a
b.append["four"]
print a  # a now has "four" in it
Run Code Online (Sandbox Code Playgroud)

基本上我想知道,而不是b = a步骤,我如何正确地制作列表或字典的副本,以便b更改时a不会随之改变?

mar*_*cog 12

您所经历的是参考的概念.Python中的所有对象有一个参考,当你指定一至两名ab,这导致两者ab指向同一个对象.

>>> a = range(3)
>>> b = a                     # same object
>>> b.append(3)
>>> a, b                      # same contents
([0, 1, 2, 3], [0, 1, 2, 3])
Run Code Online (Sandbox Code Playgroud)

使用列表,您可以创建一个新列表b,该列表是另一个使用的副本.ab = a[:]

>>> a = range(3)
>>> b = a[:]                  # make b a new copy of a
>>> b.append(3)
>>> a, b                      # a is left unchanged
([0, 1, 2], [0, 1, 2, 3])
Run Code Online (Sandbox Code Playgroud)

有关任何对象的更通用解决方案,请使用复制模块.浅拷贝将复制存储在您正在复制的对象中的引用,而深拷贝将递归地创建所有对象的新副本.

>>> a = [range(2), range(3)]
>>> b = copy.copy(a)          # shallow copy of a, equivalent to a[:]
>>> b[0] = range(4)
>>> a, b                      # setting an element of b leaves a unchanged
([[0, 1], [0, 1, 2]], [[0, 1, 2, 3], [0, 1, 2]])
>>> b[1].append(3)
>>> a, b                      # modifying an element of b modifies the element in a
([[0, 1], [0, 1, 2, 3]], [[0, 1, 2, 3], [0, 1, 2, 3]])

>>> a = [range(2), range(3)]
>>> b = copy.deepcopy(a)      # deep recursive copy of a
>>> b[1].append(3)
>>> a, b                      # modifying anything in b leaves a unchanged
([[0, 1], [0, 1, 2]], [[0, 1], [0, 1, 2, 3]])
Run Code Online (Sandbox Code Playgroud)

  • 查看http://stackoverflow.com/questions/184710/what-is-the-difference-between-a-deep-copy-and-a-shallow-copy (5认同)