首先,对不起,如果这个问题非常基础,我只是从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()?
希望我能够解释自己足够好。再次抱歉,如果这是一个基本问题。感谢。
答案 0 :(得分:1)
这与您追加的对象的可变性有关。如果对象是可变的,则可以更新它们,并且您实际上使用.append()
函数添加对列表的引用。因此,在这些情况下,您需要一份副本。
this site上找到了一个很好的列表,列出了哪些类型是可变的而不是。但是,通常,容器类型往往是可变的,而简单值通常是不可变的。