一尘不染

python按值列出,而不按引用列出

python

让我们举个例子

a=['help', 'copyright', 'credits', 'license']
b=a
b.append('XYZ')
b
['help', 'copyright', 'credits', 'license', 'XYZ']
a
['help', 'copyright', 'credits', 'license', 'XYZ']

我想在列表“ b”中附加值,但列表“ a”的值也已更改。
我想我不知道为什么会这样(python通过引用传递列表)。
我的问题是“如何通过值传递它,以使添加'b'不会更改'a'中的值?”


阅读 320

收藏
2020-02-15

共2个答案

一尘不染

b = a[:]
2020-02-15
一尘不染

要复制列表,可以使用list(a)a[:]。在这两种情况下,都会创建一个新对象。
但是,这两种方法在可变对象的集合方面存在局限性,因为内部对象保持它们的引用完整无缺:

>>> a = [[1,2],[3],[4]]

>>> b = a[:]
>>> c = list(a)

>>> c[0].append(9)

>>> a
[[1, 2, 9], [3], [4]]
>>> c
[[1, 2, 9], [3], [4]]
>>> b
[[1, 2, 9], [3], [4]]
>>> 

如果你想要对象的完整副本,则需要copy.deepcopy

>>> from copy import deepcopy
>>> a = [[1,2],[3],[4]]

>>> b = a[:]
>>> c = deepcopy(a)

>>> c[0].append(9)

>>> a
[[1, 2], [3], [4]]
>>> b
[[1, 2], [3], [4]]
>>> c
[[1, 2, 9], [3], [4]]
>>> 
2020-02-15