Python:附加原始对象与附加对象副本[重复]

Posted

技术标签:

【中文标题】Python:附加原始对象与附加对象副本[重复]【英文标题】:Python: append an original object vs append a copy of object [duplicate] 【发布时间】:2017-10-09 06:38:21 【问题描述】:

首先,对不起,如果这个问题非常基础,我只是从 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 -> 原始=1,多=2;等等……

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

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()?

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

【问题讨论】:

如果您只是在 for 循环的每次迭代开始时创建一个新的空白字典,您的代码会更简单。但除了链接问题中已涵盖的内容外,尚不清楚您的问题是什么。 @DanielRoseman,是的,我知道这是一个令人困惑的问题。无论如何,在每个循环开始时,您对新字典的看法是正确的。 【参考方案1】:

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

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

【讨论】:

“简单值通常是不可变的” - 所以 int 是不可变的? 没错。 int 本身是不可变的。但是,指向int 的变量可以更新为指向另一个(不可变)int。因此,变量可以改变值,即使 int 对象本身是不可变的。

以上是关于Python:附加原始对象与附加对象副本[重复]的主要内容,如果未能解决你的问题,请参考以下文章

python: append() into zip() 问题。 “zip”对象没有属性“附加”[重复]

在不删除原始 UserDefault 信息的情况下将数组附加到 UserDefaults

将行附加到 pandas DataFrame 而不制作新副本

如何在python pandas中附加两个数据框[重复]

附加的操作系统服务

JavaScript将属性附加到对象[重复]