初学python,请大牛看一下,下面代码什么意思?主要这段 ret = dict((k, conf[k]) for k in keys)def get_slbapi_info(conf, o):
#定义函数
keys = "apiurl region_no bid user_id access_id secret_key".split()
#将字符串分割成数组pythonret函数 , 分隔符为空白符号
#上一句执行完后pythonret函数,keys=['apiurl', 'region_no', 'bid', 'user_id', 'access_id', 'secret_key']
ret = dict((k, conf[k]) for k in keys)
#congfig是一个字典,将congfig这个字典中pythonret函数的包含上述keys的键值的键值对保存在r之中
if o is not None:
if o.bid:
ret['bid'] = o.bid
#上面三句
#o也是个对象,如果传入的o不是None并且O.bid属性存在且不为None,空字符串 , 0那么ret['bid'] = o.bid
if o.userid:
ret['user_id'] = o.user_id
# 同上
# o也是个对象,如果传入的o不是None并且O.user_id属性存在且不为None,空字符串,0那么ret['user_id'] = o.user_id
return ret
#综上所述这是一个函数 , 是用来修改原来的config(极有可能这是一个配置信息) , 修改参数放在o中
#返回的是config中['apiurl', 'region_no', 'bid', 'user_id', 'access_id', 'secret_key']的部分,
# 若o中存在新的bid和user_id,用新的bid和user_id替换旧的
#不明白可追问
python中,能对函数传递文件指针类型的参数吗如果你用C给Matlab写过MEX程序,那么这个问题是很容易理解的(好像每次讨论Python问题时我总是把Matlab搬了出来…… 《在Matlab中把struct当成Python中的Dictionary使用》《Matlab和Python的几种数据类型的比较》) 。
既然提到了MEX , 就简单说一下:
一个Matlab可能形如
function ret=add3(a,b,c)
如果在C的层面实现这个函数 , 就会看到另一种景象:
void mexFunction(int nlhs,mxArray * plhs[],int nrhs,const mxArray * prhs[])
a,b,c三个参数的地址放在一个指针数组里 , 然后把这个指针数组的首地址作为参数prhs传递给函数 , 这说明Matlab函数的参数是传递指针的,而不是值传递 。
纵然是传递的指针,但是却不能在函数里改变实参的值,因为标记为“const”了 。
Python是开放源码的,我没有看 。所以下面很多东西是猜的 。
Python在函数的参数传递时用的什么手法?实验一下(使用ActivePython2.5):
首先介绍一个重要的函数:
help(id)
Help on built-in function id in module __builtin__:
id(...)
id(object) - integer
Return the identity of an object.This is guaranteed to be unique among
simultaneously existing objects.(Hint: it's the object's memory address.)
看最后括号里那句:Hint:it's the object's address.(它是对象的地址)
有了这个函数,下面的事情就方便多了 。
a=0
id(a)
3630228
a=1
id(a)
3630216
可以看出 , 给a赋一次值,a的address就改变了 。在C的层面看,(也许真实情况不是下面的样子,但作为一个类比应该还是可以的):
void * pa;
pa=malloc(sizeof(int));
*(int *)pa=0;
free(pa);
pa=malloc(sizeof(int));
*(int *)pa=1;
Python中每次赋值会改变变量的address,分配新的内存空间,所以Python中对于类型不像C那样严格要求 。
下面看看Python函数参数传递时到底传的什么:
有一个函数:
def changeA(a):
...print id(a)
...a=100
...print id(a)
设定一个变量var1:
var1=10
id(var1)
3630108
changeA(var1)
3630108
3631012
var1
10
调用函数后 , 从两次print的结果可以看出,传递确实是地址 。但是即便如此,在函数内对形参的修改不会对实参造成任何实质的影响,因为对形参的重新赋值,只是改变了形参所指向的内存单元(changeA里两次调用print id(a)得到不同的结果),却没有改变实参的指向 。在C的层面看也许类似下面的情节:
推荐阅读
- 服务器怎么用的,服务器什么用
- chatgpt如何接入小爱同学,小爱同学连接车载
- pdf怎么转化为jpg图片,pdf怎样转化为jpg
- C2C直播什么意思,c2c平台是指什么
- go语言手机版中文版 go语言官方中文文档
- 直播说sq什么意思,直播中的sc是什么
- flutter国际化接口,flutter ui
- 小米路由器青春版怎么设置,小米路由器青春版怎么设置无线桥接
- 洛阳学习go语言 洛阳语言培训机构