Функция Python меняет значение переданного параметра

Вот пример того, где я начал

mylist = [["1", "apple"], ["2", "banana"], ["3", "carrot"]] def testfun(passedvariable): for row in passedvariable: row.append("Something else") return "Other answer" otheranswer = testfun(mylist) print mylist 

Я ожидал, что mylist не изменится.

  • Python. Параметры и возвращаемые значения
  • Python горит звездочкой в ​​аргументе функции
  • Порядок аргументов по умолчанию и не по умолчанию
  • Производительность при передаче огромного списка в качестве аргумента в рекурсивной функции?
  • Как передать метод в качестве параметра в Python
  • Затем я попытался удалить этот временный столбец, но это не сработало:

     mylist = [["1", "apple"], ["2", "banana"], ["3", "carrot"]] def testfun(passedvariable): for row in passedvariable: row.append("Something else") # I'm now finished with the "Something else" column, so remove it for row in passedvariable: row = row[:-1] return "Other answer" otheranswer = testfun(mylist) print mylist 

    Я думаю, пытался использовать другую ссылку:

     mylist = [["1", "apple"], ["2", "banana"], ["3", "carrot"]] def testfun(passedvariable): copyofdata = passedvariable for row in copyofdata: row.append("Something else") # I'm now finished with the "Something else" column, so remove it for row in copyofdata: row = row[:-1] return "Other answer" otheranswer = testfun(mylist) print mylist 

    Я написал несколько скриптов Python в течение нескольких месяцев, но никогда не сталкивался с этим раньше. Что мне нужно узнать, и как передать список функции и временно манипулировать ею (но оставить исходный нетронутый?).

  • Parse config files, environment и аргументы командной строки, чтобы получить один набор параметров
  • Производительность при передаче огромного списка в качестве аргумента в рекурсивной функции?
  • Программно определяющее количество параметров, которые требуется функции - Python
  • Передача словаря функции в python в качестве параметров ключевого слова
  • Порядок аргументов по умолчанию и не по умолчанию
  • Python горит звездочкой в ​​аргументе функции
  • 2 Solutions collect form web for “Функция Python меняет значение переданного параметра”

    Python передает все путем обмена (ссылки передаются как значение, см. Вызов путем совместного использования ), однако встроенные числовые и строковые типы являются неизменяемыми, поэтому, если вы меняете их, значение ссылки изменяется вместо самого объекта. Для изменяемых типов, таких как список, сделайте копию (например, list(passedvariable) ). Если вы изменяете изменяемые объекты в списке (который может содержать только ссылки!), Вам необходимо выполнить глубокую копию, чтобы сделать это

     import copy copy.deepcopy(passedvariable) 

    См. https://docs.python.org/2/library/copy.html (доступно с Python 2.6)

    Обратите внимание, что поскольку сами ссылки передаются по значению, вы не можете изменить ссылку, переданную как параметр, указывать на что-то еще вне функции (т.е. passvariable = passvariable [1:] не изменит значение, наблюдаемое вне функции). Общим трюком является передача списка одним элементом и изменение этого элемента.

    mylist вне функции и passedvariable – это один и тот же объект списка. Поэтому изменение списка отражается повсюду. То же самое справедливо и для copyofdata в третьем примере. Это не копия, а тот же объект списка снова. Чтобы сделать копию, вам нужно явно скопировать список, в вашем случае вам даже придется копировать каждый элемент списка, так как они также являются объектами списка. Теперь для второго примера row = row[:-1] : Здесь вы делаете копию списка, за исключением последнего элемента. Таким образом, предыдущая row не изменяется, но новый объект списка связан с одной и той же row имени.

    Python - лучший язык программирования в мире.