Почему плохая идея модифицировать локальные объекты в python?
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()
Функция собирает имена и значения из всех этих мест, чтобы предоставить вам удобный доступ ко всем из них в одном месте, но, поскольку она не знает, откуда взялась данная переменная, она не может вернуть ее обратно. Другими словами, это плохая идея, потому что она не работает.
locals - это функция, которая возвращает словарь, и здесь вы устанавливаете значение в этом словаре. Вы можете подумать, что это изменит значение локальной переменной x на 2, но это не так. locals фактически не возвращает локальное пространство имен, а возвращает копию. Таким образом, изменение не влияет на значение переменных в локальном пространстве имен.