具有共享对象引用的两个变量的总大小是多少? [复制]

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 更接近。总大小是目标对象(您的字符串)加上 两个 引用(一个地址引用 - 通常是一个存储字 - 每个)的总和。您有 ab 以及它们所引用的字符串。

【讨论】:

“目标变量”是描述字符串对象的一种误导方式,因为它根本不是变量。 @user2357112:谢谢——我让我的大脑远远领先于我的手指。 字符串不是任何对象,你说的对一般对象都是正确的,但对字符串不一定正确。 @cglacet: Strings are objects in Python. Python 没有非对象原语的概念。甚至 int 也是一个对象。 你是对的,我的错。我仍在尝试了解如何在内存中处理字符串,这实际上看起来有点复杂:***.com/questions/2123925/…

以上是关于具有共享对象引用的两个变量的总大小是多少? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 变量类型 保存内存中的位置 和 引用

第三周学习总结

为啥在这个变量赋值中引用了两个对象? [复制]

Python中的对象变量有多少个内存副本? [复制]

js深拷贝与浅拷贝的区别及实现

JS 字符串变量里能存放多少个字节(大小)?