交换函数输出与预期的不同

时间:2015-11-12 04:23:12

标签: python scope swap jes

我认为输出应为x = 5y = 3。但是,当我尝试在jes中执行它时,它会显示x=3y=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 个答案:

答案 0 :(得分:2)

嗯,这在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)

答案 1 :(得分:1)

正如其他答案所暗示的那样,这确实不需要功能。既然您决定使用它们,那么您可以尝试更多地了解scopes

为了保留您需要返回的交换值,或者在执行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()中,作为参数传递的变量xy被视为该函数的本地变量,只有swap才能看到它们的值。如果你没有返回这个值,它就会丢失并被遗忘。

答案 2 :(得分:-1)

整数在python中是不可变的。您在本地范围内将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,python中的swap可以在一行中实现,简单如下:

x, y = y, x

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

另见Python passing an integer by reference

答案 3 :(得分:-1)

在python赋值中更改对象的标识而不是其值(除非您正在改变内容)。值得注意的是,根据Python Data Model

  

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

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