Python: 更改groupdict()返回的字典
修改一个标准库对象的方法返回的可变对象是否安全?
这里有一个具体的例子;但如果可能的话,我希望能得到一个更普遍的答案。
#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
一般来说,只有当文档明确说明时,才能保证是安全的。(不过在这个特定的情况下,其他实现表现得不同的可能性很小。)