Python:追加原始对象vs附加对象的副本

时间:2017-05-10 14:29:36

标签: python list pointers copy append

首先,对不起,如果这个问题非常基础,我只是从Python开始。

我在理解Python 3.6如何创建并将对象附加到列表时遇到问题。请参阅以下代码:

a_dict=dict()
a_list=list()

for i in range(100):
  a_dict['original'] = i
  a_dict['multi'] = i*2
  a_list.append(a_dict)

列表的打印就像

print(a_list)
>>[{'original': 99, 'multi': 198}{'original': 99, 'multi': 198}...{'original': 99, 'multi': 198}]

根据我原来的想法,i = 0 - > original = 0,multi = 0; i = 1 - > original = 1,multi = 2;等...

但是,根据这个问题here,Python的append()会附加一个指向对象的指针而不是实际值。所以我更改了原始代码上的追加(原始)以追加(复制):

a_dict=dict()
a_list=list()

for i in range(100):
  a_dict['original'] = i
  a_dict['multi'] = i*2
  a_list.append(a_dict.copy()) ##change here

现在,我得到了理想的结果:

print(a_list)
[{'original': 0, 'multi': 0}, {'original': 1, 'multi': 2}, {'original': 2, 'multi': 4},...]    

现在,我的问题是:

append()如何真正起作用?始终列表包含与其原始对象类似的对象吗?其他类型怎么样?如果我的意图不是直接弄乱原始值或我正在使用的列表/容器,我是否应该总是使用copy()?

希望我能够解释自己足够好。再次抱歉,如果这是一个基本问题。感谢。

1 个答案:

答案 0 :(得分:1)

这与您追加的对象的可变性有关。如果对象是可变的,则可以更新它们,并且您实际上使用.append()函数添加对列表的引用。因此,在这些情况下,您需要一份副本。

this site上找到了一个很好的列表,列出了哪些类型是可变的而不是。但是,通常,容器类型往往是可变的,而简单值通常是不可变的。