python中def是一个可执行语句,用来定义一个函数。当解释器执行def语句时,其会在内存中创建一个函数对象,除此之外,还会创建一个该函数对应的本地命名空间。这里需要注意的有两点:1 该命名空间是在执行def语句时就已经创建的,而不是在函数调用时; 2 这个命名空间中有包含哪些变量。

对于2点,取决于函数签名已经函数类型。如果函数具有默认参数,那么该命名空间会包含默认参数变量,此外,如果该函数还是一个闭包,那么该命名空间还包含了外层函数的自由变量(即在外层函数定义,但是在内层函数中引用的变量)。

由于在执行def语句时,其命名空间就已经创建,而不是在调用时创建,且后续调用时,无论多少次调用,每次调用函数生成的多个命名空间是共享这些变量(即默认参数以及自由变量)的,而不是每次调用重新定义这些变量,因为这些变量的定义在执行def语句(即定义函数时)就定义好了。因此,如果默认参数或者自由变量是可变对象,那么如果函数中有对这些对象做原地的修改,则这个修改会对所有的调用都起作用。

看下面第一个例子。下面这个例子中,默认参数a是可变对象,且函数中对a进行了原地修改,根据上述的分析,后面每次调用f1,a并不会重新定义,而是在上次调用的基础上进一步进行修改更新a的值。

def f1(a=[1]):
    a.append(1)
    print(a)
f1() # output --> [1,1]
f1() # output --> [1,1,1]
f1() # output --> [1,1,1,1]

再看下面的第二个例子。下面这个例子中,inner函数是一个闭包,其引用了外层函数的变量a,因此a作为自由变量会在inner函数的本地命名空间中。根据上述分析,多次调用f1,会对a的值不断更新;但是如果重新执行定义inner的def语句,就会重新创建一次inner的初始命名空间,所以其中的初始变量也会重新定义,因此调用f2不会在f1的基础上更新a的值,而是同样的在上一次f2调用的基础上更新a的值。

def outer():
    a = []
    def inner():
        a.append(1)
        print(a)
    return inner
f1 = outer()
f2 = outer()
f1() # output --> [1]
f1() # output --> [1,1]
f1() # output --> [1,1,1]
f2() # output --> [1]
f2() # output --> [1,1]
f2() # output --> [1,1,1]
函数是类似于可封装的程序片段。允许你给一块 语句 一个名字,允许您在你的程序的任何地方使用指定的名字运行任何次数。 python 中有许多内置函数,如len和range。 函数概念可能是任何有价值软件中最重要的块(在任何编程语言中)。 二、定义函数使用 def 关键字 在这个关键字之后是标识函数的名字; 其次是在一对括号中可以附上一些变量名; 最后在行的末尾... - Python 使用 def 开始函数定义,紧接着是函数名,括号内部为函数的参数,内部为函数的 具体功能实现代码,如果想要函数有返回值, 在 expressions 中的逻辑代码中用 return 返回。 1 def function(): 2 print(‘This is a function’) 3 a = 1+2 4 print(a) 上面我们定义...
def 定义了一个模块的变量,或者说是类的变量。它本身是一个函数对象。属于对象的函数,就是对象的属性。 def func(): return 2print func() # 1func = 5print func # 5print func() # 错误!函数对象已经被覆盖了 在同一模块里,函数在未被定义前是不能使用的,因为它是在“运行时”定义的:print func() # 错误!函数未...
函数的定义 1.逻辑上:能够完成特定功能的独立的代码块。 2.物理上:能够接收数据【也可以不接收数据】,能够对接收的数据进行处理【也可以不对数据进行处理】,能够将数据处理的结果返【也可以没有返回值】。 3.函数定义的本质:详细描述函数之所以能够实现某个特定功能的具体方法。 返回值类型 函数名(形式参数列表) **返回值类型:**用户需要函数返回的数据类型。 **函数名:**代表的是函数的入口地址。 **形式参数列表:**就是用户将函数外部数据传入函数内部的 局部变量。 **函数体
函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 () 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。 函数的第一行 语句 可以选择性地使用文档字符串—用于存放函数说明。 函数内容以冒号起始,并且缩进。 return [表达... 其中,arguments是函数的参数,可以是多个。函数体内可以包含多条 语句 ,它们一起完成函数的功能。在函数体内部,可以使用return 语句 来返回函数的结果。 例如,如果我们要定义一个函数,用来计算两个数之和,可以这样写: def add(a,b): c = a + b return c 我们可以调用这个函数,并传入参数来进行测试,例如: print(add(3,4)) # 输出 7