gpt4 book ai didi

pythonic swap x,y = y,x 不起作用?

转载 作者:行者123 更新时间:2023-11-28 21:47:34 25 4
gpt4 key购买 nike

我刚刚意识到 pythonic swap 并不总是有效。

def swap(x,y):
x,y = y,x

a = 1
b = 2
swap(a,b)

print b

结果:2

为什么在这种情况下交换变量的 pythonic 方式不起作用?我需要临时变量吗?

最佳答案

在函数定义的第一行

def swap(x,y):

xy 是所谓的形式参数。当你打电话时

swap(a, b)

您正在将 ab 作为实际参数传递。

现在发生的是 Python 为您传入的实际参数创建新名称。

在函数体内 x 现在是内存中整数对象的新名称,它也有名称 ay 现在是内存中整数对象的新名称,也称为 b。这就是为什么 Python 既不是按值调用也不是按引用调用,而是最好描述为 call-by-assignment 的原因。 .

与流行的看法相反,调用函数和赋值对于可变参数和不可变参数的工作方式完全相同。您将看到与您观察到的可变值相同的行为:

>>> def swap(x,y):
... x,y = y,x
...
>>> a = [1]
>>> b = [2]
>>> swap(a,b)
>>> a
[1]
>>> b
[2]

因此,一旦您了解了赋值在 Python 中的工作方式,您也会了解函数调用的工作方式。

举个例子:如果你没有写一个函数,你的代码将等同于:

a = 1
b = 2
x = a
y = b
x,y = y,x
del x
del y

在第 3 行中,您正在为整数对象创建一个新名称 x,该对象的名称也为 a。第 4 行遵循相同的逻辑。

在第 5 行中,您在右侧创建了值为 (2, 1) 的元组 (y, x),然后对其进行解包,即,名称 x重新分配 为值 2,名称 y 被重新分配为值 1:

>>> a = 1
>>> b = 2
>>> x = a
>>> y = b
>>> x,y = y,x
>>> x
2
>>> y
1

这里要注意的重要一点是 ab 从未停止分别作为值 1 和 2 的名称:

>>> a
1
>>> b
2

最后两行只是解除了名称 xy 的绑定(bind),这大致等同于退出作用域后函数中发生的情况。请注意,名称 ab 在取消绑定(bind) xy 后仍然绑定(bind)。

>>> a
1
>>> b
2

关于pythonic swap x,y = y,x 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36316678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com