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

时间:2016-12-07 16:12:22

标签: python

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

(1):交换函数的作用(更确切地说,(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)

1 个答案:

答案 0 :(得分:0)

在Python中通过引用传递参数的问题是它不完全准确。例如,它与C ++中发生的情况截然不同。

定义变量时,实际上告诉Python它的名称当前绑定了某个值。这些值存在于Python VM中。当你这样做时:

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