5

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

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

#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

4 回答 4

1

通常,只有在文档说明的情况下才能保证安全。(在这种特殊情况下,另一种实现的行为似乎不太可能有所不同。)

于 2010-08-23T10:23:04.350 回答
0

groupdict每次返回一个新字典:

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

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

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

于 2010-08-23T07:35:49.967 回答
0

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

dict.popitem() 确实会更改您正在调用它的字典。

从字典中删除并返回任意 (key, value) 对。

popitem()对字典的破坏性 迭代很有用,这在集合算法中经常使用。如果字典为空,则调用 popitem()会引发KeyError.

于 2010-08-23T07:37:06.447 回答
0

这里执行了两种不同的操作m。第一个,groupdict,从 创建一个字典m。第二个,popitem,从字典中返回一个项目并修改字典(但不是基础项目)。

因此,后续调用m.groupdict()仍会从相同的.m

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

于 2010-08-23T07:38:12.067 回答