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)