Вывод функции свопа отличается от ожидаемого

Я думаю, что выход должен быть x = 5, y = 3, Но когда я попытался выполнить его в jes, это показывает, что x=3 а также y=5,

Моя функция подкачки выглядит следующим образом:

def swap (x,y):    
    temp=x
    x=y
    y=temp

И из моей функции водителя я звоню swap():

def driver():    
    x=3
    y=5
    swap(x,y)
    print x
    print y

Я хочу знать, почему результат не соответствует ожиданиям?

4 ответа

Ну, это не большая проблема в Python, вы можете вернуть несколько значений, например попробуйте этот фрагмент, он может вам помочь.

def swap(a,b):
   return (b,a)

def driver(x,y):
    print "Previous x=",x,"y=",y
    x,y = swap(x,y)
    print "Now x=", x, "y=",y

driver(3,5)

Как предлагали другие ответы, для этого действительно не нужны функции. Так как вы решили использовать их, вы также можете попытаться немного лучше понять сферу применения.

Чтобы сохранить поменяемые значения, вам нужно их вернуть, иначе они будут потеряны после выполнения swap():

def swap (x,y):
    temp=x
    x=y
    y=temp
    return x, y  # must return the swapped values.

Затем в функции, где вы вызываете swap() Вы присваиваете возвращенные значения переменным, которые вы поменяли местами:

def driver():
    x=3
    y=5
    x, y = swap(x,y)  # re-assign values
    print x
    print y

Бег driver() теперь даст вам поменянное значение:

5
3

Это происходит потому, что в функции swap() переменные x а также y Вы передаете, как аргументы обрабатываются как локальные для этой функции, только swap можно увидеть их ценность. Если вы не вернете это значение обратно, оно будет потеряно и забыто.

Целые числа неизменны в питоне. Вы устанавливаете y в x а также x в y в локальной области, но не изменяют ссылку на переданные начальные целые числа. В python лучшее, что вы можете сделать, если хотите инкапсулировать swap Функция, которая изменяет на месте, а не путем возврата, передает некоторый объект контейнера, который является изменяемым и содержит ссылки на то, что вы хотите поменять:

def swap(container):
    container[0], container[1] = container[1], container[0]

А потом назовите это так:

x = 3
y = 5
container = [x,y]
swap(container)

FWIW, swap в python может быть реализован в одну строку так же просто, как:

x, y = y, x

Что, вероятно, синтаксически яснее в большинстве случаев в любом случае.

Смотрите также Python, передающий целое число по ссылке

В Python присваивание изменяет идентичность объекта, а не его значение (если вы не изменяете содержимое). Это стоит отметить, что в соответствии с моделью данных Python

Каждый объект имеет идентичность, тип и значение.

Так поменялись личностями внутри swap не будет менять личность внутри driver, Более того, python не позволяет вам изменять значения неизменяемых типов, поэтому нет других возможных способов поменять значения внутри swap метод.

Другие вопросы по тегам