5

標準ライブラリオブジェクトのメソッドによって返される可変オブジェクトを変更しても安全ですか?

これが1つの特定の例です。しかし、可能であれば一般的な答えを探しています。

#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() ただし、呼び出している辞書は変更されます。

辞書から任意の(キー、値)ペアを削除して返します。

popitem()セットアルゴリズムでよく使用されるように、辞書を破壊的に 反復するのに役立ちます。辞書が空の場合、呼び出すと 。popitem()が発生しKeyErrorます。

于 2010-08-23T07:37:06.447 に答える
0

ここで実行されている2つの異なる操作がありmます。最初の、groupdictは、から辞書を作成しmます。2番目の、popitemは、ディクショナリからアイテムを返し、ディクショナリを変更します(ただし、基になるアイテムは変更しません)。

したがって、同じから辞書をm.groupdict()作成するためmの後続の呼び出し。

しかし、なぜあなたpopitemはまったく使用しているのですか?なぜだけではないのitems()ですか?

于 2010-08-23T07:38:12.067 に答える