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

5 投票
4 回答
897 浏览
提问于 2025-04-16 03:09

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

这里有一个具体的例子;但如果可能的话,我希望能得到一个更普遍的答案。

#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

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

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

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

我不能对整个标准库做出评论。不过你应该自己检查一下,看看一个方法是返回对象内部某个存储结构的引用,还是每次调用时都创建一个新的。groupdict 每次都会创建一个新的字典。这就是为什么修改结果字典是安全的原因。

0

这里对 m 进行了两种不同的操作。第一种是 groupdict,它会从 m 创建一个字典。第二种是 popitem,它会从这个字典中返回一个项目,并且会修改 这个字典(但不会改变底层的项目)。

所以,后续调用 m.groupdict() 仍然会从同一个 m 创建字典。

但是,为什么要使用 popitem 呢?为什么不直接用 items() 呢?

1

一般来说,只有当文档明确说明时,才能保证是安全的。(不过在这个特定的情况下,其他实现表现得不同的可能性很小。)

撰写回答