如何复制Python字符串?

时间:2014-07-17 13:06:07

标签: python string python-2.7

我这样做:

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的副本?

7 个答案:

答案 0 :(得分:110)

您不需要来复制Python字符串。它们是不可变的,copy模块总是在这种情况下返回原始文件,如str(),整个字符串切片,以及与空字符串连接。

此外,您的'hello'字符串实习certain strings are)。 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()跟踪来获取实际内存占用量,或者在未缓存和重用对象时估算最大占用空间。

答案 1 :(得分:8)

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

mysqli_real_escape_string

答案 2 :(得分:5)

我刚开始进行一些字符串操作并找到了这个问题。我可能正在尝试做一些像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

答案 3 :(得分:1)

正如其他人已经解释过的那样,很少有实际需要这样做,但是,您继续:
(适用于 Python 3,但 Python 2 可能有类似的东西)

import ctypes

copy          = ctypes.pythonapi._PyUnicode_Copy
copy.argtypes = [ctypes.py_object]
copy.restype  = ctypes.py_object

s1 = 'xxxxxxxxxxxxx'
s2 = copy(s1)

id(s1) == id(s2) # False

答案 4 :(得分:1)

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

a = "Python"
b = a[ : : -1 ][ : : -1 ]
print( "a =" , a )
print( "b =" , b )
a == b  # True
id( a ) == id( b ) # False

答案 5 :(得分:0)

换句话说“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']可以引用别的东西。

答案 6 :(得分:-1)

复制字符串可以通过两种方式复制位置a =“a”b = a或者你可以克隆这意味着当a更改时b不会受到影响,这是由a ='a'b = a [ :