python参数的引用传递

来源:互联网 发布:JS授权系统源码 编辑:程序博客网 时间:2024/05/17 04:21
记录python学习知识点Python在进行参数传递时,都是把参数的哈希值传给目标参数,即传递参数的值的内存地址,而不是值本身。除此之外,参数的引用传递需注意参数的数据类型,按数据类型的不同分为两大类:    1、不可改变的数据类型,如int、float、string、tuple。    2、可改变类型,如list、dictionary在对引用传递后参数进行自增自减操作后(不限定于常见的加减1),不可改变类型的参数会生成新的哈希值,而不是在原哈希值制定的内存地址中直接修改新数据,这跟java不同。如:
    a=0    def test(A):        A +=1        print(A)    test(a)    print(a)
输出结果为1和0,即A作为引用后的参数进行自增参数后,A的哈希值已改变。a作为被传递的参数,哈希值不变,所以a的值没有改变。对于可变类型列表和字典而言,传递后的参数在进行自增减元素时,有下面需注意的情形:1、列表:
    a=[1,2]    def test[A]:        A +=[3]  ###        print(A)    test(a)    print(a)
输出结果一样,都是[1,2,3]。因为,列表在进行操作后,把新的数据直接在原来的储存位置上修改,并没有生成新的哈希值只想新的地址。把上面代码中的 ###行换成 A=A+[3]后,即
    a=[1,2]    def test[A]:        A =A+[3]  ###        print(A)    test(a)    print(a)
输出结果为[1,2]和[1,2,3],因为A=A+[3]会把值取出来进行运算后把新数据放到新的地址中。所以需注意这里+=和=的不同2、字典
    a = []    b = {'num':0, 'sqrt':0}    for i in [1,2,3]:        b['num'] = i        b['sqrt'] = i * i        a.append(b)    print(a)
输出结果为:[{'num': 3, 'sqrt': 9}, {'num': 3, 'sqrt': 9}, {'num': 3, 'sqrt': 9}]跟我们想要的结果[{'num': 1, 'sqrt': 1}, {'num': 2, 'sqrt': 4}, {'num': 3, 'sqrt': 9}]不同。因为a中添加的元素b,都是b的引用,即b的哈希值,所以当b改变时,a也改变。以上知识点为个人粗浅总结,如有错误,请指正,谢谢。
原创粉丝点击