修改标准库对象的方法返回的可变对象是否安全?
这是一个具体的例子;但如果可能的话,我正在寻找一般答案。
#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()的调用仍返回原始字典;但就我所知,这可能与实现有关。
答案 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
正在执行两项不同的操作。第一个groupdict
从m
创建一个字典。第二个,popitem
,从字典中返回一个项目并修改字典(但不是基础项目)。
因此,对m.groupdict()
的后续调用仍然从同一m
创建字典。
但你为什么要使用popitem
呢?为什么不只是items()
?