在Python中,如果两个变量引用同一个对象,那么总大小(内存分配)是两倍还是总大小仅仅是对象的大小?
作为引用对象的变量,这是否意味着如果两次引用同一对象,就不会创建两次?
我试图获得__sizeof__()
,但不确定自己该如何学习。
a = "string"
b = a
现在在__sizeof__()
引用的字符串上调用a
方法将在Jupyter笔记本中输出55个字节。 B显然会这样做,因为它引用了相同的对象。
但是这里使用的对象的总大小是对象“字符串”的1倍还是2倍?我真的不相信.py或.ipynb的文件大小能得到准确的答案。
编辑: when does Python allocate new memory for identical strings?仅处理字符串。这个问题的答案部分取决于对象的类型(尤其是小整数)。
对象可以分别是==
和is
检查1)值相等或2)对象id 相等。对于相等的值,两个引用可能指向相同的对象或两个不同的对象(相等的值)。对于相等的对象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)
答案 0 :(得分:0)
两者都不是,尽管1x更近。总大小是目标对象(您的字符串)加上两个引用(每个地址引用-通常一个存储字)的总和。您有a
,b
以及它们引用的字符串。