我在如何像计算机科学家那样思考时会遇到以下代码,这对我来说有点奇怪。任何人都可以向我解释发生了什么事吗? 这是我试图理解它的方式。
(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)
答案 0 :(得分:0)
在Python中通过引用传递参数的问题是它不完全准确。例如,它与C ++中发生的情况截然不同。
定义变量时,实际上告诉Python它的名称当前绑定了某个值。这些值存在于Python VM中。当你这样做时:
a = [1,2,3]
b = a
a
和b
都指向[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
所持有的引用,反之亦然。但请注意,引用的实际对象不会在内存中交换。在您的功能之外,a
和b
仍然指向相同的引用,因为您实际上从未与a
和b
名称进行过互动。
在图片中,这就是发生的事情。之前:
后: