zoukankan      html  css  js  c++  java
  • Python 语言使用中遇到的问题汇总

    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,但又将他们作为返回值赋给变量,这些值也被改变

     

  • 相关阅读:
    日期类型存储方法
    Log4j2的一些记录
    【Maven】学习记录
    HTML 图片加载问题
    浏览器的组成
    javascript数组的实例属性(方法)
    javascript数组的内置对象Array
    javascript之this
    css的position,float属性的理解
    简单介绍帧动画
  • 原文地址:https://www.cnblogs.com/fendou-999/p/3519093.html
Copyright © 2011-2022 走看看