如何复制Python字符串?

usu*_* me 76 python string python-2.7

我这样做:

a = 'hello'
Run Code Online (Sandbox Code Playgroud)

现在我只想要一份独立的副本a:

import copy

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

map( id, [ a,b,c,d,e ] )
Run Code Online (Sandbox Code Playgroud)

出[3]:

[4365576160, 4365576160, 4365576160, 4365576160, 4365576160]
Run Code Online (Sandbox Code Playgroud)

为什么它们都有相同的内存地址,如何获得副本a

Mar*_*ers 120

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

此外,你的'hello'字符串被拘留(某些字符串).Python故意尝试只保留一个副本,因为这会使字典查找更快.

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

>>> a = 'hello'
>>> b = (a + '.')[:-1]
>>> id(a), id(b)
(4435312528, 4435312432)
Run Code Online (Sandbox Code Playgroud)

但你现在所做的只是浪费记忆.毕竟,这并不是说你可以以任何方式改变这些字符串对象.

如果您只想知道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
Run Code Online (Sandbox Code Playgroud)

然后,您可以选择使用id()跟踪来获取实际内存占用量,或者在未缓存和重用对象时估计最大占用空间.

  • 强调"你不需要复制Python字符串".这些操作只是返回相同的字符串是有原因的. (10认同)
  • 使用将输出[42]的示例"随便"+1;(http://en.wikipedia.org/wiki/42_%28number%29#The_Hitchhiker.27s_Guide_to_the_Galaxy). (8认同)
  • 创建新的字符串对象的方法不止一种,例如`b =''.join(a)`. (3认同)
  • 但是,在这种情况下,OP 正试图浪费内存。由于他想知道一定数量的字符串将使用多少内存,这就是实际目标。显然他可以生成唯一的字符串,但这只是作为一种解决方法的不必要的工作。 (2认同)

小智 8

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

>>> a = 'foo'  
>>> b = '%s' % a  
>>> id(a), id(b)  
(140595444686784, 140595444726400)  
Run Code Online (Sandbox Code Playgroud)

  • 在 Python 3.6.5 中不是这样。id(a) 和 id(b) 是相同的。即使我使用现代版本的格式,结果也没有什么不同,即`b = '{:s}'.format(a)` (4认同)

Cha*_*yer 8

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

>>> a = 'hello'                                                                                                                                                                                                                                                                                        
>>> b = a[:]                                                                                                                                                                                                                                                                                           
>>> c = a                                                                                                                                                                                                                                                                                              
>>> b += ' world'                                                                                                                                                                                                                                                                                      
>>> c += ', bye'                                                                                                                                                                                                                                                                                       
>>> a                                                                                                                                                                                                                                                                                                  
'hello'                                                                                                                                                                                                                                                                                                
>>> b                                                                                                                                                                                                                                                                                                  
'hello world'                                                                                                                                                                                                                                                                                          
>>> c                                                                                                                                                                                                                                                                                                  
'hello, bye'                                                                                                                                                                                                                                                                                           
Run Code Online (Sandbox Code Playgroud)

如果您习惯使用 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}                                                                                                                                                                                                                                                                                              
Run Code Online (Sandbox Code Playgroud)

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


小智 5

我刚刚开始一些字符串操作并发现了这个问题.我可能正试图做一些类似OP的事,"通常的我".以前的答案并没有消除我的困惑,但在思考了一点之后我终于"明白了".

只要a,b,c,d,并且e具有相同的价值,他们引用了同一个地方.内存已保存.一旦变量开始具有不同的值,它们就会开始具有不同的引用.我的学习经历来自这段代码:

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
Run Code Online (Sandbox Code Playgroud)

打印输出是:

[4538504992, 4538504992, 4538504992, 4538504992, 4538504992]

hello hello hello hello hello

[6113502048, 4538504992, 4538504992, 4538504992, 5570935808]

goodbye hello hello hello hello something
Run Code Online (Sandbox Code Playgroud)


小智 5

使用这个简单的技巧是可能的:

a = "Python"
b = a[ : : -1 ][ : : -1 ]
print( "a =" , a )
print( "b =" , b )
a == b  # True
id( a ) == id( b ) # False
Run Code Online (Sandbox Code Playgroud)