Python:追加原始对象与追加对象的副本

Air*_*nix 8 python pointers copy list 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)
Run Code Online (Sandbox Code Playgroud)

列表的打印如下

print(a_list)
>>[{'original': 99, 'multi': 198}{'original': 99, 'multi': 198}...{'original': 99, 'multi': 198}]
Run Code Online (Sandbox Code Playgroud)

按照我原来的想法,i=0 -> original=0, multi=0; i=1 -> 原始=1,多=2;等等...

但是,根据这里的这个问题,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
Run Code Online (Sandbox Code Playgroud)

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

print(a_list)
[{'original': 0, 'multi': 0}, {'original': 1, 'multi': 2}, {'original': 2, 'multi': 4},...]    
Run Code Online (Sandbox Code Playgroud)

现在,这是我的问题:

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

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

Joh*_*anL 7

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

在这个网站上可以找到一个很好的列表,其中列出了哪些类型是可变的,哪些是不可变的。然而,通常,容器类型往往是可变的,而简单值通常是不可变的。

  • 那是对的。`int` 本身是不可变的。但是,指向“int”的变量可以更新为指向另一个(不可变)“int”。因此,即使“int”对象本身是不可变的,变量也可以更改值。 (2认同)