如何复制 Python 字符串?

新手上路,请多包涵

我这样做:

 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 许可协议

阅读 401
2 个回答

不需要 复制 Python 字符串。它们是不可变的,并且 copy 模块在这种情况下总是返回原始值,就像 str() 一样,整个字符串切片,并与空字符串连接。

此外,您的 'hello' 字符串是 interned某些字符串是)。 Python 故意尝试只保留一个副本,因为这样可以加快字典查找速度。

解决此问题的一种方法是实际创建一个新字符串,然后将该字符串切回原始内容:

 >>> a = 'hello'
>>> b = (a + '.')[:-1]
>>> id(a), id(b)
(4435312528, 4435312432)

但是你现在所做的只是浪费内存。毕竟,您不能以任何方式改变这些字符串对象。

如果您想知道一个 Python 对象需要多少内存,请使用 sys.getsizeof() ;它为您提供了任何 Python 对象的内存占用。

对于容器,这 包括内容物;您必须递归到每个容器中以计算总内存大小:

 >>> import sys
>>> a = 'hello'
>>> sys.getsizeof(a)
42
>>> b = {'foo': 'bar'}
>>> sys.getsizeof(b)
280
>>> sys.getsizeof(b) + sum(sys.getsizeof(k) + sys.getsizeof(v) for k, v in b.items())
360

然后,您可以选择使用 id() 跟踪来获取实际的内存占用量,或者如果对象未被缓存和重用则估计最大占用量。

原文由 Martijn Pieters 发布,翻译遵循 CC BY-SA 4.0 许可协议

我刚刚开始一些字符串操作并发现了这个问题。我可能正在尝试做一些像 OP 那样的事情,“平常的我”。前面的回答并没有解决我的困惑,但经过一番思考,我终于“明白了”。

As long as a , b , c , d , and e have the same value, they reference到同一个地方。内存被保存。一旦变量开始具有不同的值,它们就会开始具有不同的引用。我的学习经验来自这段代码:

 import copy
a = 'hello'
b = str(a)
c = a[:]
d = a + ''
e = copy.copy(a)

print map( id, [ a,b,c,d,e ] )

print a, b, c, d, e

e = a + 'something'
a = 'goodbye'
print map( id, [ a,b,c,d,e ] )
print a, b, c, d, e

打印输出是:

 [4538504992, 4538504992, 4538504992, 4538504992, 4538504992]

hello hello hello hello hello

[6113502048, 4538504992, 4538504992, 4538504992, 5570935808]

goodbye hello hello hello hello something

原文由 karl s 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题