Метод обмена, адаптируемый к любой структуре данных - PullRequest
0 голосов
/ 05 февраля 2012

Я сталкиваюсь с этой проблемой при реализации моего собственного swap() метода с Python

def swap(a,b):
    temp=a
    a=b
    b=temp

list_=[5,4,6,3,7]
swap(list_[4],list_[2])

Я ожидал, что list_ будет обновлен с помощью вызова swap(), так как list_[4] и list_[2] должны быть назначеныновые значения во время вызова функции.Однако list_ остается неизменным:

list_
   [5, 4, 6, 3, 7]

Я неправильно понимаю, почему вызов функции подкачки имеет дело с копией.Я не хочу ни добавлять аргумент списка в свою функцию подкачки, ни возвращать список во время вызова swap (), поскольку я хочу, чтобы метод был адаптируем для других структур данных, как в

 swap(mat[0][1],mat[2,3])

Ответы [ 2 ]

8 голосов
/ 05 февраля 2012

Вы не знаете, как работает Python:

list_=[5,4,6,3,7]
swap(list_[4],list_[2]) # this is absolutely the same as
swap(7,6)

Основополагающим понятием Python является использование имен и значений.Когда вы записываете имя в коде, оно обозначает значение, прикрепленное к нему во время выполнения.В этом случае list_[4] - это имя, которое обозначает значение 7.

Если вы хотите что-то изменить, вы должны использовать одно из его имен.Здесь вы хотите изменить list_, поэтому вы должны сделать это:

def swap(data, i1, i2):
    data[i1], data[i2] = data[i2], data[i1]

swap(list_, 4,2) # swaps list index 4 and 2
5 голосов
/ 05 февраля 2012

Python проходит по значению, поэтому своп не влияет на исходный список.просто используйте

list_[4], list_[2] = list_[2], list_[4]
...