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中的所有对象有一个参考,当你指定一至两名a和b,这导致两者a并b指向同一个对象.
>>> 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)