我怎样才能复制一个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。 以前的答案没有弄清楚我的困惑,但经过一番思考,我终于“明白了”。
只要a
, b
, c
, d
和e
具有相同的值,它们就指向相同的地方。 内存被保存。 一旦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不会受到影响