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

Python 交换函数输出与预期不同,python,scope,swap,jes,Python,Scope,Swap,Jes,我认为输出应该是x=5,y=3。但是,当我尝试在jes中执行它时,它显示x=3和y=5 我的交换功能如下: def swap (x,y): temp=x x=y y=temp 从驱动程序函数调用swap(): 我想知道为什么输出不符合预期?整数在python中是不可变的。您正在本地范围中将y设置为x并将x设置为y,但未修改对传入的初始整数的引用。在python中,如果要封装就地修改而不是通过返回来修改的swap函数,最好的方法是传递某种容器对象,该容器对象是可变

我认为输出应该是
x=5
y=3
。但是,当我尝试在jes中执行它时,它显示
x=3
y=5

我的交换功能如下:

def swap (x,y):    
    temp=x
    x=y
    y=temp
从驱动程序函数调用
swap()


我想知道为什么输出不符合预期?

整数在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)
python中的FWIW、swap可以在一行中实现,如下所示:

x, y = y, x
在大多数情况下,这在语法上可能更清晰


另请参见

正如其他答案所建议的,这实际上不需要函数。既然您已经决定使用它们,那么您不妨尝试更多地了解它们

为了保留交换的值,您需要返回这些值,否则它们在执行
swap()
后会丢失:

然后,在调用
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
才能看到它们的值。如果您不返回此值,它将丢失并被遗忘。

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

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

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


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

@Downvoter,你在理解Python数据模型方面有问题吗?我不是反对者,但我想说这个答案很难理解,对一个显然是初学者的OP来说也没什么用处。@PaulRooney:但这是每个初学者都需要知道的概念(证明我自己也是初学者)。但是这是一个视角,我不相信这个问题是它被标记为的问题的重复。这个问题更多的是关于范围和基本功能。为什么我的答案被否决,它回答了这个问题。问这个问题的人刚刚提到交换不起作用,所以我给了他一个有效的片段。
5
3
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)