如果在Python中将相同的字符串添加到两个不同的列表或集合中,您是否使用了两倍的内存?

时间:2010-06-28 05:35:25

标签: python

例如,如果将相同的字符串添加到dict和列表中?

4 个答案:

答案 0 :(得分:4)

字符串的副本不会同时放入两者中,它们只指向一个字符串。

答案 1 :(得分:3)

字符串是不可变的,永远不会被复制。实际上,即使您手动请求副本,您仍将获得相同的对象:

>>> import copy
>>> s = "abc"
>>> t = copy.copy(s)
>>> u = copy.deepcopy(s)
>>> id(s), id(t), id(u)
(139730866789424, 139730866789424, 139730866789424)
>>> s is t, s is u
(True, True)

答案 2 :(得分:3)

如果它是相同的字符串,则只存在其中一个副本(以及对该单个对象的两个引用)。另一方面,两个相同的字符串最终可以作为两个副本,这取决于编译器能够做什么优化以避免重复。

例如,考虑一下(Python 2.6或更早版本 - 不确定未来可能会添加哪些进一步的优化):

>>> def f1(s, d, l):
...   d['z'] = s
...   l.append(s)
... 
>>> d={}
>>> l=[]
>>> f1('ciao', d, l)
>>> d['z'] is l[0]
True
>>> def f1(s, d, l):
...   d['z'] = s + 'zap'
...   l.append(s + 'zap')
... 
>>> f1('ciao', d, l)
>>> d['z'] is l[1]
False
>>> d['z'] == l[1]
True
>>> 

第一个是明智的 - 显然是同一个对象。第二个涉及两个相等的字符串 - 如果编译器更智能,它可以检测到相等和优化的东西以避免重复,但是,一般来说,Python的编译器被调整为编译非常快,而不是花很多时间来优化事物。

答案 3 :(得分:0)

没有。如果您有一个字符串对象:

s = "Some string."

然后你把它添加到一个词典和一个列表中:

d = {"akey": s}
l = [s]

然后d["akey"]l[0]将指向与s相同的字符串对象,而不是指向内容为“Some string”的两个不同对象。