gpt4 book ai didi

python - 什么时候创建引用,什么时候分配新的内存块然后复制?

转载 作者:太空狗 更新时间:2023-10-29 21:28:46 25 4
gpt4 key购买 nike

>>> d
{1: 1, 2: 2, 3: 3}
>>> lst = [d, d]
>>> c=lst[0]
>>> c[1]=5
>>> lst
[{1: 5, 2: 2, 3: 3}, {1: 5, 2: 2, 3: 3}]

lst = [d, d]时,lst[0]lsg[1]都是对内存块的引用d,而不是创建两个内存块并将d的内容分别复制到它们?

c=lst[0]时,c只是对lst[0]占用内存的引用,而不是创建一个新的内存块并从 lst[0] 复制内容?

在Python中,什么时候创建一个引用指向一个已经存在的内存块,什么时候分配一个新的内存块然后复制?

Python的这个语言特性与C不同,这个语言特性的名称是什么?

谢谢。

最佳答案

所有变量(和其他容器,如字典、列表和对象属性)都保存对对象的引用。实例化对象时发生内存分配。简单赋值总是创建对现有对象的另一个引用。例如,如果您有:

a = [1, 2, 3]
b = a

那么ba指向同一个对象,一个列表。您可以使用 is 运算符验证这一点:

print(b is a)    # True

如果您更改 a,那么 b 也会更改,因为它们是同一对象的两个名称。

a.append(4)
print(b[3] == 4) # True
print(b[3] is a[3]) # also True

如果你想创建一个副本,你必须明确地这样做。以下是执行此操作的一些方法:

  • 对于列表,使用切片:b = a[:]
  • 对于许多类型,您可以使用类型名称来复制该类型的现有对象:b = list(a)。创建您自己的类时,如果您需要复制功能,这是一个很好的方法。
  • copy 模块具有可用于复制对象(浅层或深层)的方法。

对于不可变类型,例如字符串、数字和元组,永远不需要复制。您只能通过引用不同的值来“更改”这些类型的值。

对此的最好描述可能是“一切皆对象”。在 C 中,像整数这样的“原始”类型与数组的处理方式不同。在 Python 中,它们不是:所有值都存储为对对象的引用——甚至是整数。

关于python - 什么时候创建引用,什么时候分配新的内存块然后复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30249921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com