Python对象混淆 : a=b, 修改b和a的变化!

标签 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

基本上我想知道,除了 b = a 这一步,我如何正确地制作列表或字典的副本,以便在 b 更改时 a不也随之改变吗?

最佳答案

你遇到的是引用的概念。 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])

有了列表,你可以创建一个新列表b那是另一个 a副本使用 b = 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])

对于任何对象的更通用的解决方案,请使用 copy module .浅拷贝将复制存储在您正在复制的对象中的引用,而深拷贝将递归地制作所有对象的新副本。

>>> 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]])

关于Python对象混淆 : a=b, 修改b和a的变化!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4588100/

相关文章:

ASP.net 页面在导入语句上出现错误,但我确实有适当的引用?

python - 输出相同时不覆盖文件的简单方法

python - pyparsing 删除一些文本以及如何使用空格捕获文本

c - 将变量地址放入 C 中的另一个变量中

c# - 如何在for循环中保留变量的位数

c++ - 如何制作 char 的拷贝而不是 C++ 中的引用

c++ - 如果通过lambda函数对象返回对局部变量的引用,会发生什么情况?

python - 处理同时属于 'public interface' 和 'used internally' 的 Python 包内容的方法?

python - 如何在python中基于dct.keys创建组

javascript - 可以直接用setinterval调用clearinterval吗?