Почему плохая идея модифицировать локальные объекты в python? - PullRequest
5 голосов
/ 14 февраля 2011

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

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

Ответы [ 5 ]

7 голосов
/ 15 февраля 2011

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

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

foo()
4 голосов
/ 11 мая 2011

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

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

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

3 голосов
/ 15 февраля 2011

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

2 голосов
/ 15 февраля 2011

С погружение в Python

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

0 голосов
/ 15 февраля 2011

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

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

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

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


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

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

...