Изменение переменных в функции Python влияет на переменные с различными именами вне функции
У меня есть вложенный словарь, содержащий кучу данных о ряде различных объектов (где я имею в виду объект в непрограммном смысле этого слова). Формат словаря-allData[i] [someDataType], где i-числовое обозначение объекта, по которому у меня есть данные, а someDataType-конкретный массив данных, связанный с рассматриваемым объектом.
Теперь у меня есть определенная функция, которая требует определенного массива данных для выполнения вычисления. для каждого объекта. Массив данных называется cleanFDF
. Поэтому я передаю это своей функции вместе с кучей других вещей, которые она требует для работы. Я называю это так:
rm.analyze4complexity(allData[i]['cleanFDF'], other data, other data, other data)
Внутри самой функции я сразу же переназначаю данные cleanFDF
другому имени переменной, а именно clFDF
. То есть конечный результат таков:
clFDF = allData[i]['cleanFDF']
Затем я должен обнулить все данные, которые лежат ниже определенного порога, как такового:
clFDF[ clFDF < threshold ] = 0
OK-функция работает так, как и положено. Но теперь, когда я ... попробуйте построить исходные данные cleanFDF обратно в главном скрипте, записи, которые были обнулены в clFDF, также обнуляются в allData[i]['cleanFDF']
. ВТФ? Очевидно, здесь происходит что-то, чего я не понимаю.
Чтобы сделать ситуацию еще более странной (с моей точки зрения), я попытался сделать боди Клудж, чтобы обойти это, "сохранив" массив в другую переменную перед вызовом функции. То есть я делаю
saveFDF = allData[i]['cleanFDF']
Затем запустите функцию, а затем обновите запись cleanFDF
с сохраненными данными:
allData[i].update( {'cleanFDF':saveFDF} )
Но каким-то образом, просто выполняя clFDF[ clFDF clFDF, saveFDF
и allData[i]['cleanFDF']
в главном гребаном скрипте, обнуляя все целые в тех же индексах массива! Это похоже на то, что все они каким-то образом связаны с глобальными переменными, но я нигде не делал таких заявлений...
2 ответа:
Вы передаете значение по адресу
allData[i]['cleanFDF']
по ссылке (достойное объяснение в https://stackoverflow.com/a/430958/337678 любые изменения, внесенные в него, будут внесены в объект, на который он ссылается, который по-прежнему является тем же объектом, что и оригинал, только присвоен другой переменной.Создание глубокой копии данных, вероятно, исправит вашу проблему (Python имеет библиотеку deepcopy, которая должна сделать трюк ;)).
Все является ссылкой в Python.
def function(y): y.append('yes') return y example = list() function(example) print(example)
Он вернет ['yes'], хотя я не изменяю напрямую переменную 'example'.
См. Почему list.добавить значение false?, Python append () против оператора + в списках, почему они дают разные результаты?, списки Python добавляют возвращаемое значение .