具有共享对象引用的两个变量的总大小是多少? [复制]
Posted
技术标签:
【中文标题】具有共享对象引用的两个变量的总大小是多少? [复制]【英文标题】:What is the total size of two variables that have a shared object reference? [duplicate] 【发布时间】:2019-08-13 22:11:15 【问题描述】:在 Python 中,如果两个变量引用同一个对象,那么总大小(内存分配)是翻倍还是总大小只是对象的大小?
作为变量引用对象,是否意味着同一个对象被引用两次就不会被创建两次?
我尝试获取__sizeof__()
,但我不确定我应该如何自己学习。
a = "string"
b = a
现在在 a
引用的字符串上调用 __sizeof__()
方法将在 Jupyter 笔记本中输出 55 个字节。 B 显然也会这样做,因为它引用了同一个对象。
但是这里使用的对象的总大小是对象“字符串”的 1 倍还是 2 倍?我真的不相信 .py 或 .ipynb 的文件大小可以得到准确的答案。
编辑: when does Python allocate new memory for identical strings? 仅地址字符串。这个问题的答案部分取决于对象的类型(尤其是小整数)。
对象可以是 1) 值相等 或 2) 对象 id 相等,分别是 ==
和 is
检查。对于相等的值,两个引用可能指向同一个对象或两个不同的对象(相等的值)。对象 id 相等时,两个引用只指向一个对象。
在第一种情况下,总大小是两个引用 + 一个或两个对象,具体取决于实现。对于第二种情况,只有两个引用和一个对象。
对于小整数(和小字符串),Python 会自动缓存它们,因此即使完成了两个对象分配,它们也始终共享一个引用。 ==
和 is
都将评估为 True
。
相同的值,相同的对象:
S1 = 'string'
S2 = 'string'
S1 == S2, S1 is S2
#Out: (True, True)
相同的值,不同的对象:
S1 = 'a longer string'
S2 = 'a longer string'
S1 == S2, S1 is S2
#Out: (True, False)
【问题讨论】:
内存中只有一个字符串对象。 你不应该相信 .py 文件的大小——它实际上与你的程序在运行时将占用多少内存无关。 考虑变量占用的空间不是很有用 - 从技术上讲,变量占用空间,但 Python 程序中真正有意义的空间消耗几乎总是由 objects,而不是变量。变量只是保存对象引用的一种方式。 @cglacet,你告诉我.. 对于初学者来说,另一个答案似乎非常复杂,我试图在一个简单的情况下理解共享引用的总内存分配。如果我的问题看起来太相似,我可以删除它。 @cglacet 这看起来不适合这个问题。 【参考方案1】:两者都不是,尽管 1x 更接近。总大小是目标对象(您的字符串)加上 两个 引用(一个地址引用 - 通常是一个存储字 - 每个)的总和。您有 a
、b
以及它们所引用的字符串。
【讨论】:
“目标变量”是描述字符串对象的一种误导方式,因为它根本不是变量。 @user2357112:谢谢——我让我的大脑远远领先于我的手指。 字符串不是任何对象,你说的对一般对象都是正确的,但对字符串不一定正确。 @cglacet: Strings are objects in Python. Python 没有非对象原语的概念。甚至 int 也是一个对象。 你是对的,我的错。我仍在尝试了解如何在内存中处理字符串,这实际上看起来有点复杂:***.com/questions/2123925/…以上是关于具有共享对象引用的两个变量的总大小是多少? [复制]的主要内容,如果未能解决你的问题,请参考以下文章