Почему плохая идея модифицировать локальные объекты в python?

Связанный с этим ответом здесь. Документ местных жителей здесь.

Документы упоминают, что словарь не должен меняться, не уверен, что это означает, но будет locals() быть применимым в лабораторных отчетах, где данные не изменятся, например, в измерениях?

5 ответов

Решение

Модификация - плохая идея, потому что в документации (на которую вы ссылаетесь) явно сказано:

Примечание: содержание этого словаря не должно быть изменено; изменения могут не повлиять на значения локальных и свободных переменных, используемых интерпретатором.

Вам не нужно больше причин, чем это.

Если вы используете его таким образом, чтобы не изменять никакие переменные, то все будет в порядке, но я бы поставил под сомнение дизайн и посмотрел, есть ли лучший способ сделать то, что вы хотите.


В конкретном примере, на который вы ссылаетесь, locals - это на самом деле globals(), поскольку вы используете его в глобальной области видимости модуля. Это очень специфическое использование работает сейчас, и, хотя я ожидаю, что оно продолжит работать так же, как и с глобальными, вы можете вместо этого просто использовать глобальные.

Даже более чистое решение, вероятно, заключается в том, чтобы, не зная остальной части вашего дизайна, использовать обычный старый словарь для ваших переменных; затем используйте data["x"] = значение вместо глобальных ()["x"] = значение.

Документация гласит, что когда у вас есть местный x переменная и сделать locals()['x'] = 42, затем x может еще указывать на старый объект.

def foo():
    x = 0xABCD
    locals()['x'] = 42
    print(x)

foo()

В некоторых случаях вызов locals() возвращает значения, собранные из нескольких источников, а не указатель на локальную область.

Пример. Внутри вызова функции locals() возвращает комбинацию глобальной области видимости и области, локальной для функции. В этом случае изменение вывода localals () не приведет к каким-либо изменениям в локальной области видимости, потому что он по существу использует остров. Кажется, что единственные случаи, когда он работает, это случаи, когда его вывод совпадает с выводом globals().

Другими словами, вы либо хотите использовать globals(), либо найти другой способ достижения той же цели.

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

Из погружения в Python

locals - это функция, которая возвращает словарь, и здесь вы устанавливаете значение в этом словаре. Вы можете подумать, что это изменит значение локальной переменной x на 2, но это не так. locals фактически не возвращает локальное пространство имен, а возвращает копию. Таким образом, изменение не влияет на значение переменных в локальном пространстве имен.

Другие вопросы по тегам