例如,如果将相同的字符串添加到dict和列表中?
答案 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”的两个不同对象。