Python 语言使用中遇到的问题汇总
2014-01-14 15:16
489 查看
1.python中的传值和传引用
和其他语言不一样,传递参数的时候,python不允许程序员选择采用传值还是传引用。Python参数传递采用的肯定是“传对象引用”的方式。实际上,这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象--相当于通过“传值'来传递对象。
python一般内部赋值变量的话,都是传个引用变量,和C语言的传地址的概念差不多。可以用 id() 来查询内存地址
如果a=b的话, a和b的地址是相同的;如果只是想拷贝,那么就得用 a=b[:]。
!!!注意这一点,这可是可以引起重大错误的!!!
2.python中简单的回调函数示例(与C中回调函数类似):
3.使用ctypes库时,在python中定义的函数在动态库中被回调
说明:_fmd_adm_case_iter为动态库函数调用,该函数中回调了python中定义的dfault_rec函数,主要重点为黄色背景代码
4.python语言中没有指针的概念,如第1条所述,但是我们想要像C一样能够传址而改变值该如何实现?
python与C有一个很大的不同点就是可以有多个返回值,简单的示例如下:
在项目中,我利用返回值再赋值给原来的变量即可改传入的参数值
上述代码中,在C中,传入的是&class, &fru, &serial, &resource, &asru, &dummy_fru,这些值被改变
在python中,传入的是class_t, fru, serial, resource, asru, dummy_fru.value,但又将他们作为返回值赋给变量,这些值也被改变
和其他语言不一样,传递参数的时候,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中定义的函数在动态库中被回调
def dfault_rec(acp,arg): print("begin--dfault_rec") def get_cases_from_fmd(adm,uurecp,opt_i): print("begin--get_cases_from_fmd") libs = load_lib("/usr/lib/fm/libfmd_adm.so") if libs == 0: print("Error in load_lib") return [] _fmd_adm_case_iter = libs.fmd_adm_case_iter CMPFUNC = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.POINTER(fmd_adm_caseinfo_t), ctypes.c_void_p) py_dfault_rec = CMPFUNC(dfault_rec) rt = _fmd_adm_case_iter(adm, None, py_dfault_rec, uurecp) if rt != 0 : print("failed to get case list from fmd") 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,但又将他们作为返回值赋给变量,这些值也被改变
相关文章推荐
- 使用Python+Selenium过程中中常见的问题汇总
- 在CentOS上使用Neatbeans开发C++,调用Python的过程、遇到的问题和解决办法
- 关于python语言使用redis时,连接是否需要关闭的问题
- RobotFramework+Selenium2library使用遇到的问题汇总
- python学习(1)第一次在pycharm中使用matplot遇到的问题
- python安装scikit-learn遇到问题汇总
- 使用pandas(python3)遇到的一些问题
- python使用中遇到的问题记录
- 使用LR11过程中遇到的一些问题汇总
- Python 3.6 使用 pyinstaller 打包exe文件遇到的问题
- python初学遇到的问题汇总
- Python2.5使用新浪微博Python SDK遇到的问题与解决方法
- CGI和BOA使用期间遇到的问题汇总(转)
- play框架配置使用过程中遇到的各种疑难问题汇总(学习同事经验)
- Emacs使用anaconda-mode进行Python补全时遇到的问题
- python使用requests爬取网页,遇到中文出现乱码的编码问题及解决
- 使用10.04过程中遇到了很多中文问题,都解决了,汇总下来供大家参考
- (笔记)Linux下的CGI和BOA使用期间遇到的问题汇总
- MySQL_使用时遇到的问题汇总
- CGI和BOA使用期间遇到的问题汇总