python: изменение словаря, возвращаемого groupdict () - PullRequest
5 голосов
/ 23 августа 2010

Безопасно ли изменять изменяемый объект, возвращаемый методом стандартного объекта библиотеки?

Вот один конкретный пример;но я ищу общий ответ, если это возможно.

#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 ]

1 голос
/ 23 августа 2010

Как правило, только гарантированно будет безопасным, если в документации это указано(В этом конкретном случае кажется маловероятным, что другая реализация будет вести себя иначе.)

0 голосов
/ 23 августа 2010

В этом конкретном случае вы должны быть в безопасности, поскольку MatchObject.groupdict() возвращает словарь, представляющий сопоставленные группы, но каждый раз это новая копия.

dict.popitem() меняет ли словарь, из которого вы его вызываете.

Удалите и верните произвольное (ключ, значение) из словаря.

popitem() полезно для деструктивно итерации по словарю, как это часто используется в алгоритмах множеств.Если словарь пуст, вызов popitem() поднимает KeyError.

0 голосов
/ 23 августа 2010

Здесь m выполняется две разные операции.Первый, groupdict, создает словарь из m.Второй, popitem, возвращает элемент из словаря и модифицирует словарь (но не базовый элемент).

Таким образом, последующие вызовы m.groupdict() все еще создают словарь из того же m.

Но почему вы вообще используете popitem?Почему не просто items()?

0 голосов
/ 23 августа 2010

groupdict каждый раз возвращает новый словарь:

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

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

Хотя я не могу говорить о всей стандартной библиотеке.Вы должны сами проверить, возвращает ли метод ссылку на некоторую внутренне сохраненную структуру внутри объекта или создает новую каждый раз, когда он вызывается.groupdict создает новый каждый раз.Вот почему безопасно изменять словарь результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...