我这样做:
a = 'hello'
现在我只想要 a
的独立副本:
import copy
b = str(a)
c = a[:]
d = a + ''
e = copy.copy(a)
map( id, [ a,b,c,d,e ] )
出[3]:
[4365576160, 4365576160, 4365576160, 4365576160, 4365576160]
为什么它们都有相同的内存地址,我怎样才能得到 a
的副本?
原文由 usual me 发布,翻译遵循 CC BY-SA 4.0 许可协议
您 不需要 复制 Python 字符串。它们是不可变的,并且
copy
模块在这种情况下总是返回原始值,就像str()
一样,整个字符串切片,并与空字符串连接。此外,您的
'hello'
字符串是 interned ( 某些字符串是)。 Python 故意尝试只保留一个副本,因为这样可以加快字典查找速度。解决此问题的一种方法是实际创建一个新字符串,然后将该字符串切回原始内容:
但是你现在所做的只是浪费内存。毕竟,您不能以任何方式改变这些字符串对象。
如果您想知道一个 Python 对象需要多少内存,请使用
sys.getsizeof()
;它为您提供了任何 Python 对象的内存占用。对于容器,这 不 包括内容物;您必须递归到每个容器中以计算总内存大小:
然后,您可以选择使用
id()
跟踪来获取实际的内存占用量,或者如果对象未被缓存和重用则估计最大占用量。