• python的函数调用和参数传递


    不可变对象(immutable):int、string、float、number、tuple

    可变对象(mutable):dict、list

    对于基本数据类型的变量,变量传递给函数后,函数会在内存中复制一个新的变量,从而不影响原来的变量。(我们称此为值传递)

    但是对于list来说,列表传递给函数的是一个指针,指针指向序列在内存中的位置,在函数中对表的操作将在原有内存中进行,从而印象原有变量。(我们称此为指针传递)

    如何定义函数?

    • def 关键词开头,后接函数标识符名称和圆括号()
    • 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
    • 函数内容以冒号起始,并且缩进。
    • return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。

    关于不可变对象类型的函数定义、调用和传参:

    # -*- coding:utf-8 -*-
    
    a = 1
    
    def change_a_1(a):
        a += 1
        print a
        return a
    
    def change_a_2(a):
        a += 1
        print a
    
    print a
    print change_a_1(a)   
    print a
    a = change_a_1(a)
    print a
    a = change_a_2(a)
    print a
    

     最终打印出来的结果有几个?又分别是什么?主要涉及三个知识点,函数的定义、函数的调用以及传参,一旦弄清楚了,就很容易回答这个问题了。

    函数的定义:

    a = 1
    
    def change_a_1(a):
        a += 1
        print a
        return a
    
    def change_a_2(a):
        a += 1
        print a
    

    函数的调用:

    print change_a_1(a)
    print a
    

     注意:函数的定义与函数的执行,是两个过程。定义的函数如果不调用是不会执行的!

    所以说,最终的打印结果和返回结果如下:

    print a          #1
    print change_a_1(a) #2(函数return的返回值),2(函数内部的打印结果)
    print a          #1
    a = change_a_1(a)
    print a          #2,2
    a = change_a_2(a)
    print a          #3(函数内部一次),None(最终打印结果)
    

     关于全局变量和局部变量:

    如果函数内任意地方有赋值,那么这个被解释为局部变量;

    如果函数内没有赋值,函数之前有赋值,那么将被解释为全局变量。

    注意:函数内部禁止使用全局变量!(#注释后为打印值)
    def change_a_3(a):
        a = 6
        a += 1
        print a
        return a
    
    a = 2
    print change_a_3(a)      #7,7
    print a                         #2
    a = change_a_3(a)
    print a                         #7,7
    

     关于可变对象类型的函数定义、调用和传参:

    b = [1, 2, 3, 4]
    
    
    def change_b(b):
        b = b[1]
        print b
        return b
    
    def change_b_1(b):
        b.append(13)
        print b
        return b
    
    def change_b_2(b):
        b = [9, 7, 6, 6, 4]
        b.append(13)
        print b
        return b
    
    print b       #[1,2,3,4]
    b.pop(1)
    print b       #[2,3,4]
    print change_b(b)    #3,3
    print b       #[2,3,4]
    b = change_b(b)
    print b       #3,3
    
    b = [1, 2, 3, 4]
    print change_b_1(b) #[1,2,3,4,13],[1,2,3,4,13]
    print change_b_1(b) #[1,2,3,4,13,13],[1,2,3,4,13,13]
    print change_b_2(b) #[9,7,6,6,4,13]
    print change_b_2(b) #[9,7,6,6,4,13]
    

    1.当函数的传入参数代表唯一的值,也就是像int这种内部无法改变的,外部的变量是无法修改的。对同名的外部变量赋值,也无法改变外部变量的值。
    2.当函数传入参数是像list,dict,类对象这样代表一个集合的话,可以对传入参数的内部做修改,引起外部变量值的变化。但是对同名的外部变量直接赋值,是不会改变外部变量的结果的。

  • 相关阅读:
    用DECODE进行排序
    linux下批量替换文件内容
    Linux下chkconfig命令详解
    linux 命令参数列表过长以及find用法
    参数上使用自定义注解在aop中无法获取到该参数
    AOP
    AOP aspect XML 配置
    AOP前世与今生,aspect
    ETL工具之——kettle使用简介
    ETL工具之kittle使用案例整理
  • 原文地址:https://www.cnblogs.com/general-seven/p/5895602.html
Copyright © 2020-2023  润新知