我在如何像计算机科学家一样思考时遇到了以下代码,这对我来说有点奇怪。有人能向我解释一下发生了什么事吗? 以下是我试图理解它的方式。你知道吗
(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)
在Python中说参数是通过引用传递的问题是,它不是完全准确的。例如,它与C++中发生的情况非常不同。你知道吗
定义变量时,实际上是告诉Python它的名称当前绑定到某个值。在pythonvm中存在的值。当您这样做时:
a
和b
指向[1,2,3]
的同一引用,这就是a.append(4)
也会影响b
的原因。但是,如果将b
重新定义为新值,则会注意到a
不受影响:执行此操作时,没有修改
b
所指的引用。您只是告诉Python,虽然b
过去指向[1,2,3]
,但现在它指向"hello"
。您从未与内存中的对象[1,2,3]
交互,只与b
名称交互。你知道吗在
swap
函数中,当您执行x, y = y, x
时,您会告诉Python,x
名称现在指向y
持有的引用,反之亦然。但是请注意,被引用的实际对象并没有在内存中交换。在函数之外,a
和b
仍然指向相同的引用,因为实际上从未与a
和b
名称交互。你知道吗在图片中,就是这样。之前:
之后:
相关问题 更多 >
编程相关推荐