Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果在Python中将相同的字符串添加到两个不同的列表或集合中,是否使用了两倍的内存?_Python - Fatal编程技术网

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

如果在Python中将相同的字符串添加到两个不同的列表或集合中,是否使用了两倍的内存?,python,Python,例如,如果您将同一字符串添加到dict和列表中?字符串的副本不会同时放入这两个字符串中,它们只是都指向一个字符串。否。如果您有一个字符串对象: s = "Some string." 然后你把它添加到,比如说,一个目录和一个列表中: d = {"akey": s} l = [s] 然后d[“akey”]和l[0]将指向与s相同的字符串对象,而不是两个内容为“Some string”的不同对象。字符串是不可变的,永远不会被复制。事实上,即使手动请求副本,您仍然会得到相同的对象: >>

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

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

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

s = "Some string."
然后你把它添加到,比如说,一个目录和一个列表中:

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

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

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

>>> 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)
如果是同一个字符串,则只存在该字符串的一个副本(以及对该单个对象的两个引用)。另一方面,两个相等的字符串很可能最终成为两个副本,这取决于编译器能够进行哪些优化以避免重复

例如,考虑一下(Python2.6或更早版本--不确定将来可能添加哪些进一步的优化):


第一个是不需要动脑筋的——显然是同一个物体。第二种方法涉及两个相等的字符串——如果编译器更聪明的话,它可以检测到相等并进行优化以避免重复,但是,一般来说,Python的编译器被调整为编译速度非常快,而不会花太多时间进行优化。

Pyhton中的字符串是不可变的,因此,您永远不会看到像修改一个容器中的字符串神秘地影响另一个容器中的字符串这样的奇怪效果。当然,如果使用
intern
,您可以获得给定字符串的单个全局副本。在我编写的一个Python程序中,我使用它来极大地减少内存使用量,该程序分析内存中100万条记录中的数据集。
>>> 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
>>>