python:更改groupdict()返回的字典

时间:2010-08-23 07:29:12

标签: python object mutable

修改标准库对象的方法返回的可变对象是否安全?

这是一个具体的例子;但如果可能的话,我正在寻找一般答案。

#m is a MatchObject
#I know there's only one named group in the regex
#I want to retrieve the name and the value
g, v = m.groupdict().popitem()
#do something else with m

这段代码安全吗?我担心通过改变groupdict()我会破坏对象m(我以后还需要它)。

我对此进行了测试,随后对m.groupdict()的调用仍返回原始字典;但就我所知,这可能与实现有关。

4 个答案:

答案 0 :(得分:1)

一般情况下,只有保证才能安全。 (在这种特殊情况下,似乎不太可能另一种实现方式表现不同。)

答案 1 :(得分:0)

groupdict每次都会返回一个新词典:

In [20]: id(m.groupdict())
Out[20]: 3075475492L

In [21]: id(m.groupdict())
Out[21]: 3075473588L

虽然我不能谈论整个标准库。您应该检查自己,方法是否返回对对象内部存储的结构的引用,或者每次调用时都创建一个新结构。 groupdict每次都会创建一个新的。这就是为什么修改结果字典应该是安全的。

答案 2 :(得分:0)

在这种特殊情况下你应该是安全的,因为MatchObject.groupdict()返回一个代表匹配组的字典,但每次都是一个新副本。

dict.popitem() 更改您正在调用的词典。

  

删除并返回任意(键,   来自字典的对。

     

popitem()破坏性非常有用   经常迭代字典   用于集合算法。如果   字典是空的,打电话   popitem()提出KeyError

答案 3 :(得分:0)

此处m正在执行两项不同的操作。第一个groupdictm创建一个字典。第二个,popitem,从字典中返回一个项目并修改字典(但不是基础项目)。

因此,对m.groupdict()的后续调用仍然从同一m创建字典。

但你为什么要使用popitem呢?为什么不只是items()