在python中尝试交换两个变量时的奇怪行为

2024-06-07 08:30:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我在如何像计算机科学家一样思考时遇到了以下代码,这对我来说有点奇怪。有人能向我解释一下发生了什么事吗? 以下是我试图理解它的方式。你知道吗

(1):swap函数所做的(更准确地说,(x,y)=(y,x))是交换x和y的引用

(2):调用swap(a,b)函数时,它是通过引用传递的。也就是说,a和x将共享引用,y和b将共享引用。你知道吗

(3):基于(1)和(2),我们只交换x和y的引用,而a和b没有任何变化。这就是为什么这个交换函数不起作用的原因。你知道吗

有人能告诉我这种理解是否正确吗?你知道吗

def swap(x, y):      # Incorrect version
     print("before swap statement: x:", x, "y:", y)
     (x, y) = (y, x)
     print("after swap statement: x:", x, "y:", y)

a = ["This", "is", "fun"]
b = [2,3,4]
print("before swap function call: a:", a, "b:", b)
swap(a, b)
print("after swap function call: a:", a, "b:", b)

Tags: 函数代码def计算机方式原因functioncall
1条回答
网友
1楼 · 发布于 2024-06-07 08:30:27

在Python中说参数是通过引用传递的问题是,它不是完全准确的。例如,它与C++中发生的情况非常不同。你知道吗

定义变量时,实际上是告诉Python它的名称当前绑定到某个值。在pythonvm中存在的值。当您这样做时:

a = [1,2,3]
b = a

ab指向[1,2,3]的同一引用,这就是a.append(4)也会影响b的原因。但是,如果将b重新定义为新值,则会注意到a不受影响:

b = "hello"
print(a) # [1,2,3]

执行此操作时,没有修改b所指的引用。您只是告诉Python,虽然b过去指向[1,2,3],但现在它指向"hello"。您从未与内存中的对象[1,2,3]交互,只与b名称交互。你知道吗

swap函数中,当您执行x, y = y, x时,您会告诉Python,x名称现在指向y持有的引用,反之亦然。但是请注意,被引用的实际对象并没有在内存中交换。在函数之外,ab仍然指向相同的引用,因为实际上从未与ab名称交互。你知道吗

在图片中,就是这样。之前:

Before swapping

之后:

After swapping

相关问题 更多 >

    热门问题