我怎样才能复制一个Pythonstring?

我这样做:

a = 'hello' 

而现在我只想要一个独立的副本:

 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] 

为什么他们都有相同的内存地址,我怎样才能得到一个副本?

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

此外,你的'hello'string是interned ( 某些string )。 Python故意试图保留一个副本,因为这使字典查找更快。

解决这个问题的一个方法是实际创build一个新的string,然后将该string切片回原始内容:

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

但是你现在所做的只是浪费记忆。 毕竟,你不能以任何方式改变这些string对象。

如果你只想知道一个Python对象需要多less内存,可以使用sys.getsizeinfo() ; 它给你任何Python对象的内存占用。

对于容器,这不包括内容; 你将不得不recursion到每个容器来计算一个总的内存大小:

 >>> 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 

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

您可以通过string格式在python中复制一个string:

 >>> a = 'foo' >>> b = '%s' % a >>> id(a), id(b) (140595444686784, 140595444726400) 

我刚开始一些string操作,发现这个问题。 我可能正在尝试做一些像“平常我”这样的OP。 以前的答案没有弄清楚我的困惑,但经过一番思考,我终于“明白了”。

只要abcde具有相同的值,它们就指向相同的地方。 内存被保存。 一旦variables开始有不同的值,他们开始有不同的引用。 我的学习经验来自这个代码:

 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 

复制一个string可以通过两种方式来完成:复制位置a =“a”b = a或者你可以克隆这意味着当a被a ='a'b = a [:]完成时,b不会受到影响