传参时传递可变对象,实际上传的是指向内存地址的指针/引用
这个标题是我的结论,也是我在做项目过程查到的。学过C的都知道,函数传参可以传值,也可以传指针。指针的好处此处不再赘述。
先上代码看看效果:
def trans(var):
return var
source = {
1: 1}
dist = trans(source)
source[2] = 2
print(source)
print(dist)
运行结果:
{
1: 1, 2:2}
{
1: 1, 2:2}
可以看到改变了source
时,dist
也跟着改变了。原因就是source
是可变对象,传递参数时,传的是其引用(C的指针)。dist
和source
都指向了同一片内存空间。在运行source[2] = 2
时,是对内存空间的数据的变更,所以dist
也跟着变化。
有什么作用呢?场景应该很多,不过本人资历尚浅,想不到典型场景,就拿自己的项目举例。
项目中我定义了一个类,这个类用来读写配置,预存一些json配置,客户端可以读取配置,当预存的配置不包含客户端读取的配置时,就从设备读取。
我需要这个类实例化出多个对象,对应多个客户端。但我希望预存的配置可以是公共的,这样对于陌生配置,不用所有的客户端请求时,都需要从设备读取。
一开始我是这么写的:
global dataset
dataset = {
}