gpt4 book ai didi

Python 名称/绑定(bind) - 为什么不是所有长度相同的列表都是 "same list"?

转载 作者:太空宇宙 更新时间:2023-11-04 10:03:37 25 4
gpt4 key购买 nike

我知道有大量关于 Python 中的指针和引用(或者更确切地说:名称和绑定(bind)!)的资源,但我很难理解最后一点:

我知道如果 a = 1b = 1 比它们都“绑定(bind)”到相同的 1 并且将具有相同的 id () (因此,我认为是内存地址)。如果你设置,我也会得到:

a = [1, 2, 4]
b = a
b[0] = 45
# a is now [45, 2, 4]

因为 ab 绑定(bind)到同一个列表(对象),并且其中一个的更改会导致另一个的更改。同样,a[0]b[0] 是同一个对象。该列表包含具有不同 ID 的其他对象 - 即列表标识未绑定(bind)到其内容。

好的。到目前为止,一切都很好。我可以接受有“未出生的”列表和数字在等待初始化(尽管只有一次!),并且一旦我们需要它们,Python 就会负责为它们分配内存空间。那为什么,如果我这样做:

d = [1, 2]
e = [145, 7]
# id(d) and id(e) are not the same?!

Python 的存在中不应该只有一个 2 元素列表吗?这对我来说是一致的(然后只有一个 1、一个 2、一个 145 等)。

任何解释都将不胜感激——包括将它与指针相关联的解释(因为我对在内存管理级别做出的决定也有些迷惑,但我想这是 Python 的执行模型而不是我关心的问题!)

最佳答案

您被 CPython 中针对 int 的优化(即 int 缓存)误导了。参见 this著名的问题。这记录在案 here :

The current implementation keeps an array of integer objects for all integers between -5 and 256, when you create an int in that range you actually just get back a reference to the existing object.

几乎在所有其他情况下,使用文字都会创建一个新对象。实际上,在该范围之外使用 int,您会看到正常的行为:

>>> a = 100000
>>> b = 100000
>>> id(a)
4322630608
>>> id(b)
4322630640
>>> c = a
>>> id(a) == id(b)
False
>>> id(a) == id(c)
True

我几乎每天都需要重复这个,但是 Python 中的赋值从不复制

关于Python 名称/绑定(bind) - 为什么不是所有长度相同的列表都是 "same list"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42102561/

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