1.python中的传值和传引用
和其他语言不一样,传递参数的时候,python不允许程序员选择采用传值还是传引用。Python参数传递采用的肯定是“传对象引用”的方式。实际上,这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象--相当于通过“传值'来传递对象。
python一般内部赋值变量的话,都是传个引用变量,和C语言的传地址的概念差不多。可以用 id() 来查询内存地址
如果a=b的话, a和b的地址是相同的;如果只是想拷贝,那么就得用 a=b[:]。
!!!注意这一点,这可是可以引起重大错误的!!!
2.python中简单的回调函数示例(与C中回调函数类似):
def my_callback(input): print ("function my_callback was called with %s input" % (input,)) def caller(input, func): func(input) for i in range(5): caller(i, my_callback) 输出: function my_callback was called with 0 input function my_callback was called with 1 input function my_callback was called with 2 input function my_callback was called with 3 input function my_callback was called with 4 input
3.使用ctypes库时,在python中定义的函数在动态库中被回调
1 def dfault_rec(acp,arg): 2 print("begin--dfault_rec") 3 4 5 def get_cases_from_fmd(adm,uurecp,opt_i): 6 print("begin--get_cases_from_fmd") 7 8 libs = load_lib("/usr/lib/fm/libfmd_adm.so") 9 if libs == 0: 10 print("Error in load_lib") 11 return [] 12 13 _fmd_adm_case_iter = libs.fmd_adm_case_iter 14 CMPFUNC = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.POINTER(fmd_adm_caseinfo_t), ctypes.c_void_p) 15 py_dfault_rec = CMPFUNC(dfault_rec) 16 17 rt = _fmd_adm_case_iter(adm, None, py_dfault_rec, uurecp) 18 if rt != 0 : 19 print("failed to get case list from fmd") 20 21 print("end--get_cases_from_fmd")
说明:_fmd_adm_case_iter为动态库函数调用,该函数中回调了python中定义的dfault_rec函数,主要重点为黄色背景代码
4.python语言中没有指针的概念,如第1条所述,但是我们想要像C一样能够传址而改变值该如何实现?
python与C有一个很大的不同点就是可以有多个返回值,简单的示例如下:
def secondvalue(a,b): c = a + b return (a,b,c) x,y,z = secondvalue(1,2) print ('x:',x,'y:',y,'z:',z) 输出: x: 1 y: 2 z: 3
在项目中,我利用返回值再赋值给原来的变量即可改传入的参数值
C语言中: extract_record_info(nva[i], &class, &fru, &serial, &resource, &asru, &dummy_fru, ba[i]) ... ... python中: class_t, fru, serial, resource, asru, dummy_fru = extract_record_info(nva[i], class_t, fru, serial, resource, asru, dummy_fru.value, ba[i]) def extract_record_info(nvl, class_p, fru_p, serial_p, resource_p, asru_p, dummy_fru, status): return (class_p, fru_p, serial_p, resource_p, asru_p, dummy_fru)
上述代码中,在C中,传入的是&class, &fru, &serial, &resource, &asru, &dummy_fru,这些值被改变
在python中,传入的是class_t, fru, serial, resource, asru, dummy_fru.value,但又将他们作为返回值赋给变量,这些值也被改变