今天给一个朋友讲 Python,他提问在Python 中函数是传值还是传引用。
值变量
这个问题其实是一个伪问题,在 Python、Java、C#中根本不存在传值还是传引用的说法。理解这个问题先要从变量说起(以 Python 为例)
a = 10
b = 20
此时变量 a 就表示数字 10,b 表示数字 20,内存布局如下:
如果做赋值
c = a

此时 a、c 是两块不同的内存空间,因为a 表示的是数字 10,当为 c 赋值的时候就把数字 10 赋值给了 c。此时 a、c 都表示数字 10。
地址变量
继续看例子
l = [1, "abc", 10]
变量 l 里面有多个元素,所以 l 不再是具体的某一个值。它表示一个地址。
再次强调:变量 l 表示一个地址变量 l 表示一个地址变量 l 表示一个地址所以当赋值的时候,我们是把地址赋给一个新的变量
t = l

总结
变量有两种含义,一个表示值(变量本身的值)一个表示地址(复合数据的开始地址),所以当我们赋值的时候是把值赋给新的变量或者把地址赋给新的变量。这个语义始终都是一致的,包括在函数传递的时候。所以其实并不存在传值或者传引用的概念,是变量的语义本身是值还是地址。
判断一个变量是值还是引用的方法很简单,就看这个数据是简单类型还是复合类型(从数据结构的角度来说)。
欢迎加入我的知识星球(免费)

欢迎关注公众账号了解更多信息“写程序的康德——思考、批判、理性”

文章转载自写程序的康德,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




