gpt4 book ai didi

python - 哪些类型的 Python 对象是用引用初始化的,哪些不是?

转载 作者:行者123 更新时间:2023-11-28 17:59:25 24 4
gpt4 key购买 nike

我在 Windows 上的 Python 3.7 中使用 sys.getrefcount。我尝试了以下方法:

>>> import sys
>>> x = "this is an arbitrary string"
>>> sys.getrefcount(x)
2

我理解其中一个引用是x,另一个是sys.getrefcount内部使用的参数。无论将 x 初始化为何种类型,这似乎都有效。但是,当我在通过之前没有分配时,我注意到了一些奇怪的行为:

>>> import sys
>>> sys.getrefcount("arbitrary string")
2
>>> sys.getrefcount(1122334455)
2
>>> sys.getrefcount(1122334455+1)
2
>>> sys.getrefcount(frozenset())
2
>>> sys.getrefcount(set())
1
>>> sys.getrefcount(object())
1
>>> sys.getrefcount([])
1
>>> sys.getrefcount(lambda x: x)
1
>>> sys.getrefcount(range(1122334455))
1
>>> sys.getrefcount(dict())
1
>>> sys.getrefcount(())
8341
>>> sys.getrefcount(tuple())
8340
>>> sys.getrefcount(list("arbitrary string"))
1
>>> sys.getrefcount(tuple("arbitrary string"))
1
>>> sys.getrefcount(("a", "r", "b", "i", "t", "r", "a", "r", "y", " ", "s", "t", "r", "i", "n", "g"))
2

这是怎么回事?似乎不可变类型有两个引用而可变类型只有一个?为什么看起来有些对象在传递之前就已赋值,而另一些对象只有一个引用作为参数?这和str/int/tuple internment有关系吗?

编辑:一个更直接的问题:为什么选择像 frozenset() 这样的不可变类型在构造时有一个引用,而像 set() 这样的可变类型没有?我单独理解为什么您可能选择保留这个全局范围的引用或不全面,但为什么会出现差异?

最佳答案

一个有趣的问题所以这里是一个有趣的read .

你应该试试 getrefcount(2),对我来说它返回了 93,这意味着 CPython 为同一个内存地址保留了 93 个引用,保持第二个,所以它不必分配它再次,因为它是不可变的,所以这样做完全没问题。

现在让我们尝试两种不同的方法:

# first
getrefcount(set()) # returns 1

# second
s = set()
getrefcount(s) # returns 2

因为它是可变类型,当您创建可变类型 (set()) 时,它的行为是不同的,它将在内存中分配它并且只有一个对它的引用,它在结束后立即被删除这条线。但是在第二个我们定义变量并分配它,当计算引用时我们有一个被 s 使用的和一个在函数 getrefcount 中使用的。

在 Python 中 tuples are immutable ,这就是它返回大量数字的原因,CPython 保留了大量对空元组的引用。

关于python - 哪些类型的 Python 对象是用引用初始化的,哪些不是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56487409/

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