如何复制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 asked 2019-10-06T22:13:47Z
5个解决方案
108 votes

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

此外,您的id()字符串已被扣留(某些字符串是)。 Python故意尝试只保留一个副本,因为这会使字典查找更快。

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

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

但是,您现在要做的只是浪费内存。 毕竟,似乎您无法以任何方式使这些字符串对象发生变异。

如果您只想知道Python对象需要多少内存,请使用id(); 它为您提供了任何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 answered 2019-10-06T22:14:39Z
8 votes

您可以通过字符串格式在python中复制字符串:

>>> a = 'foo'  
>>> b = '%s' % a  
>>> id(a), id(b)  
(140595444686784, 140595444726400)  
Richard Urban answered 2019-10-06T22:15:02Z
5 votes

我刚刚开始一些字符串操作,发现了这个问题。 我可能正在尝试执行OP,“通常是我”。 先前的答案并没有消除我的困惑,但是经过一番思考之后,我终于“明白了”。

只要abcde具有相同的值,它们引用的位置相同。 内存已保存。 一旦变量开始具有不同的值,它们便开始具有不同的引用。 我的学习经验来自以下代码:

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 answered 2019-10-06T22:15:42Z
0 votes

换句话说,“ id()”并不是您所关心的。 您想知道是否可以在不损害源变量名称的情况下修改变量名称。

>>> a = 'hello'                                                                                                                                                                                                                                                                                        
>>> b = a[:]                                                                                                                                                                                                                                                                                           
>>> c = a                                                                                                                                                                                                                                                                                              
>>> b += ' world'                                                                                                                                                                                                                                                                                      
>>> c += ', bye'                                                                                                                                                                                                                                                                                       
>>> a                                                                                                                                                                                                                                                                                                  
'hello'                                                                                                                                                                                                                                                                                                
>>> b                                                                                                                                                                                                                                                                                                  
'hello world'                                                                                                                                                                                                                                                                                          
>>> c                                                                                                                                                                                                                                                                                                  
'hello, bye'                                                                                                                                                                                                                                                                                           

如果您习惯使用C,那么它们就像指针变量,只是您不能取消引用它们以修改它们指向的内容,但是id()会告诉您它们当前指向的位置。

当您考虑更深的结构(例如列表或字典)时,Python程序员就会遇到问题:

>>> o={'a': 10}                                                                                                                                                                                                                                                                                        
>>> x=o                                                                                                                                                                                                                                                                                                
>>> y=o.copy()                                                                                                                                                                                                                                                                                         
>>> x['a'] = 20                                                                                                                                                                                                                                                                                        
>>> y['a'] = 30                                                                                                                                                                                                                                                                                        
>>> o                                                                                                                                                                                                                                                                                                  
{'a': 20}                                                                                                                                                                                                                                                                                              
>>> x                                                                                                                                                                                                                                                                                                  
{'a': 20}                                                                                                                                                                                                                                                                                              
>>> y                                                                                                                                                                                                                                                                                                  
{'a': 30}                                                                                                                                                                                                                                                                                              

在这里,o和x指的是相同的dict o ['a']和x ['a'],并且该dict是“可变的”,因为您可以更改键“ a”的值。 这就是为什么“ y”需要为副本,而y ['a']可以引用其他内容的原因。

Charles Thayer answered 2019-10-06T22:16:26Z
-1 votes

复制字符串可以通过两种方式完成,要么复制位置a =“ a” b = a,要么可以克隆,这意味着当a更改时,b将不会受到影响,这是通过a ='a'b = a [:]完成的

Thomas Y answered 2019-10-06T22:16:52Z
translate from https://stackoverflow.com:/questions/24804453/how-can-i-copy-a-python-string