Как комментарий nneonneo под ответом Блейки (который описывает значительную часть проблемы) утверждает, что код в исходном сообщении не на самом деле делать то, что он утверждает. Например:
def foo(A):
tmp = A
tmp = tmp + 1
return (A, tmp)
foo(3)
(3,4)
возвращается, означая было оставлено без изменений.
Если это не так, это где A - изменяемый тип. Переменные типы включают в себя списки, словари и производные типы, в то время как целые числа, поплавки и кортежи не изменяются.
Например:
def foo(A):
tmp = A
tmp[0] = tmp[0] + 1
return (A, tmp)
foo([1, 2])
который возвращает ([2, 2], [2, 2])
, и в этом случае А изменилось.
Это foo изменяет значение A в случае списка, но не целочисленный случай, потому что списки являются изменяемыми, а целые - нет. Присвоение A tmp, когда A является изменяемым типом, присваивает ссылку на изменяемый объект, а изменение одного из его элементов (как в tmp[0] = tmp[0] + 1
) не создает новый объект.
Если вы не хотите, чтобы ваша функция имела подобное поведение в отношении побочных эффектов для списка, например, общая идиома Python заключается в использовании нотации среза для дублирования списка. Это позволит сделать новый список объектов, когда вы назначаете его TMP, который является копией объекта списка в A:
def foo(A):
tmp = A[:]
# this slice makes a new list, a copy of A
tmp[0] = tmp[0] + 1
return (A, tmp)
foo([1, 2])
Это возвращает ([1, 2], [2, 2])
, так А без изменений и TMP изменяется.
Есть и другие способы копирования списков или других изменяемых объектов, которые тонко отличаются друг от друга. How to clone or copy a list? имеет отличное описание вашего выбора.
Я предполагаю, что, основываясь на вопросе о том, что вы попытались упростить код, чтобы сделать ваш вопрос ясным, но в итоге упростил основной вопрос из него. Если вы упростите свой код, чтобы попытаться сделать свой вопрос более кратким, обязательно проверьте его первым! :) –
Я действительно уменьшил проблему достаточно далеко, чтобы я мог безопасно уменьшить код до такого размера, но случайно я путал две версии моего кода. Оба они содержали одну и ту же ошибку, хотя и в другом положении. Комбинация этих двух, как вы правильно сделали, значительно упрощена. К счастью, решение проблемы было дано, несмотря на это. – Erik
Без проблем, рад, что смог в конце концов помочь, несмотря на мою начальную путаницу! –