让我们举个例子
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’中的值?”
发布于 2012-01-05 22:30:09
在Python中不能通过值传递任何内容。如果要创建a
的副本,可以按照official Python FAQ中所述显式执行此操作
b = a[:]
发布于 2012-01-05 23:24:16
要复制列表,可以使用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]]
>>>
发布于 2016-01-07 00:33:51
在性能方面,我最喜欢的答案是:
b.extend(a)
检查相关替代方案在性能方面的比较:
In [1]: import timeit
In [2]: timeit.timeit('b.extend(a)', setup='b=[];a=range(0,10)', number=100000000)
Out[2]: 9.623248100280762
In [3]: timeit.timeit('b = a[:]', setup='b=[];a=range(0,10)', number=100000000)
Out[3]: 10.84756088256836
In [4]: timeit.timeit('b = list(a)', setup='b=[];a=range(0,10)', number=100000000)
Out[4]: 21.46313500404358
In [5]: timeit.timeit('b = [elem for elem in a]', setup='b=[];a=range(0,10)', number=100000000)
Out[5]: 66.99795293807983
In [6]: timeit.timeit('for elem in a: b.append(elem)', setup='b=[];a=range(0,10)', number=100000000)
Out[6]: 67.9775960445404
In [7]: timeit.timeit('b = deepcopy(a)', setup='from copy import deepcopy; b=[];a=range(0,10)', number=100000000)
Out[7]: 1216.1108016967773
https://stackoverflow.com/questions/8744113
复制相似问题