3

I think the output should be x = 5, y = 3. But, when I tried executing it in jes it shows that x=3 and y=5.

My swap function is as follows:

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

And from my driver function I call swap():

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

I want to know why isn't the output as expected?

4

4 回答 4

3

好吧,这在 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)
于 2015-11-12T04:31:20.133 回答
1

正如其他答案所暗示的那样,这确实不需要函数。既然您已经决定使用它们,那么您不妨尝试更多地了解范围

为了保留交换的值,您需要返回它们,否则它们在执行后会丢失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()变量被视为该函数的本地变量,只能看到它们的值。如果你不返回这个值,它就会丢失并被遗忘。xyswap

于 2015-11-12T04:29:48.250 回答
-1

在 python 中,赋值改变的是对象的身份而不是它的值(除非你正在改变内容)。值得注意的是,根据Python 数据模型

每个对象都有一个标识、一个类型和一个值。

所以交换里面的身份swap不会改变里面的身份driver。此外,python 不允许您更改不可变类型的值,因此,没有其他可能的方法来交换swap方法内的值。

于 2015-11-12T04:39:04.643 回答
-1

整数在 python 中是不可变的。您在本地范围内设置ytoxxto y,但没有修改对传入的初始整数的引用。在 python 中,如果您想封装一个swap就地修改而不是通过 return 修改的函数,您可以做的最好的事情是 pass某种可变的容器对象,包含对您要交换的事物的引用:

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

然后这样称呼它:

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

FWIW,python中的交换可以在一行中简单地实现:

x, y = y, x

无论如何,在大多数情况下,这可能在语法上更清晰。

另请参阅Python 通过引用传递整数

于 2015-11-12T04:29:22.903 回答