Изменение переменных в функции 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 2

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 добавляют возвращаемое значение .