交换函数输出与预期不同



我认为输出应该是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

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

好吧,

这在 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()变量xy作为参数传递的变量被视为该函数的局部变量,只有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 方法中的值。

相关内容

  • 没有找到相关文章

最新更新