我认为输出应该是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
我想知道为什么输出不符合预期?
这在 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
才能看到它们的值。如果不返回此值,它将丢失并被遗忘。
整数在 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
在python中,赋值会更改对象的标识而不是其值(除非您要更改内容(。值得注意的是,根据Python数据模型
每个对象都有一个标识、类型和值。
因此,在swap
内部交换身份不会改变driver
内的身份。此外,python 不允许你更改不可变类型的值,因此没有其他可能的方法可以交换 swap
方法中的值。