首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >python按值而不是按引用列出

python按值而不是按引用列出
EN

Stack Overflow用户
提问于 2012-01-05 22:28:52
回答 10查看 234.1K关注 0票数 185

让我们举个例子

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’中的值?”

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2012-01-05 22:30:09

在Python中不能通过值传递任何内容。如果要创建a的副本,可以按照official Python FAQ中所述显式执行此操作

b = a[:]
票数 254
EN

Stack Overflow用户

发布于 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]]
>>> 
票数 155
EN

Stack Overflow用户

发布于 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
票数 36
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8744113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档