Python 函数的参数传递

前言

文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

作者:风,又奈何

PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http://t.cn/A6Zvjdun

背景:一条微博问题:

首先,我们比较熟悉的函数传参的两种方式是:

  1. 传值:传入被调函数的是一个实参副本。被调函数中对形参的操作不会影响实参变量;
  2. 传引用:传入被调函数的是实参变量的地址,形参的操作就是寻址处理,被调函数中对形参的操作会影响实参变量。

典型的传值、传引用方式如 C 语言,C 语言中的变量 hold 住了一块内存区域。

而 Python 对变量的处理有很大不同。此外,Python 中的函数参数传递是遵循极具 Python 土味的 Call-by-Object(传递对象),也有叫 call-by-object-reference 的(传递对象的引用,或传对象的地址指向),不是 C 传统思维里的传值或传引用。

且听慢慢道来。

首先,Python 中一切皆对象,是的,数字、列表、字典等等啥都是对象。其次,Python 的变量充其量就是对象的一个引用,变量赋值操作 = 其实是把一个名字绑定到对象上,通俗语气讲,变量就是一个标签,一个名字,仅此而已,不像 C 语言那样:

a = 5  # a 是对象 5 的一个引用,a 是 5 的一个名字、标签b = 5  # b 是对象 5 的又一个引用,b 是 5 的又一个名字、标签

# 看看以下的 id 值吧,都是 140732178864064(类似这样的数字):id(a)  # 140732178864064id(b)  # 140732178864064id(5)  # 140732178864064

上述代码说明了 a、b 都不是个事儿,它们只是个标签记号,辅助你记住 5 这个对象,5 这个对象才是主角。

来看一个函数:

a = 5def test(p):    p = 10    print(p, "in test.")

test(a)print(a)

# 结果:10 in test.5

来解释:

  1. 给对象 5 一个名字 / 标签叫 a——a 绑定到对象,是对象的一个引用;
  2. Python 的参数传递其实也是赋值,也即前述的把名字绑定到对象。调用 test 函数时,传递的是对象 5,再确切点是对象 5 的地址指向。这时,对象 5 又多了一个名字 p,现在对象 5 有了两个名字:a、p;
  3. 执行 p = 10 时,p 这个名字从对象 5 上给“撕了下来”,并贴给了 10 这个对象,现在对象 5 只剩下一个名字 a 了。

就这么简单。

再来看看本道题目中的例子:

def f(x=[]):    x.append(1)    return xprint(f(), f())
  1. def 的时候会构造一个函数对象(名为 f)。构造函数对象的时候,发现有一个默认参数,因此也会按要求初始化默认参数——空 List 对象 [],并“贴上”标签 x。函数对象构建后,其附带的一系列方法和属性也都初始完毕,且存于内存,在后续调用中被共享;
  2. x.append(1) 会在 List 对象中追加一个项,值为 1;
  3. print(f(), f()) 中第一个 f() 先调用执行,找到共享的名为 x 的 List 对象,并 append 一下 1,此时 List 为 [1]。接下来调用执行第二个 f(),仍是在已有的名为 f 的函数对象上执行 append(1),此时 List 变为 [1, 1];
  4. 好了,要打印了。这时候虽然有两处 f(),但都是同一个函数对象,其返回值也就都一样并变成了最后的结果:[1, 1],因此打印出来就有两个 [1, 1]:[1, 1] [1, 1]。

————— 补充 —————

有人问:传统函数内部的局部变量是存在栈上,函数退出后就会销毁,为啥x没有被销毁?

函数是对象,def 时就构建了,默认参数作为属性也相应初始化(提示:f.__defaults__),而默认参数值 List 对象一直伴随着函数对象存在。这里每次都是返回同个函数对象的这个 List 对象的地址指向(跟传参一样),在打印时才取出 List 值,但这时 List 值已经是第二次 f() 后的值了。甚至你还可以比如这样看看:

f()print(f.__defaults__[0])f()print(f.__defaults__[0])

Python 一切皆对象可不是闹着玩的,谁说 Python 简单了?

如果想了解更多关于python的应用,可以私信小编

原文地址:https://www.cnblogs.com/python0921/p/12587849.html

时间: 2024-10-04 03:45:50

Python 函数的参数传递的相关文章

Python函数(二)-参数传递

首先是规定个数的参数传递,有两种传递方式 一个是位置参数,还有一个是关键字参数 位置参数 根据位置顺序来传递参数 # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" def test(a,b): #a和b为形参 print(a) print(b) return 0 test(1,2) #1和2为实参 运行结果 按照位置顺序,1赋值给了a,2赋值给了b 关键字参数 根据形参的值来传递参数 # -*- coding:utf-8 -*- __

Python与Javascript函数的参数传递

(整理中) 在 python 中,类型属于对象,变量是没有类型的: a=[1,2,3] a="Runoob" 以上代码中,[1,2,3] 是 List 类型,"Runoob" 是 String 类型,而变量 a 是没有类型,她仅仅是一个对象的引用(一个指针),可以是 List 类型对象,也可以指向 String 类型对象. 可更改(mutable)与不可更改(immutable)对象 在 python 中,strings, tuples, 和 numbers 是不可

Python 函数 参数传递

参数传递    在 python 中,类型属于对象,变量是没有类型的:        a=[1,2,3]        a="Runoob"    以上代码中,[1,2,3] 是 List 类型,"Runoob" 是 String 类型,而变量 a 是没有类型,她仅仅是一个对象的引用(一个指针),可以是指向 List 类型对象,也可以是指向 String 类型对象. 可更改(mutable)与不可更改(immutable)对象    在 python 中,strin

Python函数解析

对于Python的函数,我们需要记住的是: 1. 函数的默认返回值是None. 2. python是一个自上而下逐行解释并执行的语言.因此,函数的定义必须在函数被调用之前.同名的函数,后定义的会覆盖前面定义的. 3. 程序执行的时候,遇到函数定义只会先将函数整体读进内存,并不立刻执行.等到函数被调用的时候才执行函数体. 4. python函数的参数传递的是一个引用而不是值.这点很重要.这一点可以用下面的例子证明: def f1(a_list): s = id(a_list) a_list[0]

Python函数知识点总结

1.函数的定义2.如何定义一个函数以及函数语法3.函数的调用4.函数的参数(形参,实参)以及参数的传递5.函数的返回值6.变量的作用域7.匿名函数8.嵌套函数和闭包9.装饰器 1.函数的定义 函数是组织好的,可重复使用的,用来实现一定功能的代码段.函数能提高应用的模块性,和代码的重复利用率. 2.如何定义一个函数以及函数语法 函数代码块以def关键词开头,后接函数名称和圆括号()传入的任何参数和自变量放在圆括号()中间函数的内容以冒号起始,并且缩进函数的第一行语句可以选择性的使用文档字符串---

python函数入参和返回值

以下内容参考自runoob网站,以总结python函数知识点,巩固基础知识,特此鸣谢! 原文地址:http://www.runoob.com/python3/python3-function.html 函数格式大体如下def 函数名(参数列表): 函数体 例子: # 计算面积函数 def area(width, height): return width * height 定义一个函数:给了函数一个名称,指定了函数里包含的参数,和代码块结构. 这个函数的基本结构完成以后,不会执行,除非被调用 如

Python 函数01

Python 函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己创建函数,这被叫做用户自定义函数. 定义一个函数 你可以定义一个由自己想要功能的函数,以下是简单的规则: 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号(). 任何传入参数和自变量必须放在圆括号中间.圆括号之间可以用于定义参数. 函数的第一行语句可以选择性地使用文档字符串-用于

15、python 函数

Python 函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己创建函数,这被叫做用户自定义函数. 定义一个函数 你可以定义一个由自己想要功能的函数,以下是简单的规则: 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号(). 任何传入参数和自变量必须放在圆括号中间.圆括号之间可以用于定义参数. 函数的第一行语句可以选择性地使用文档字符串-用于

Lesson 022 —— python 函数

Lesson 022 -- python 函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.Python提供了许多内建函数,比如print().也可以自己创建函数,这被叫做用户自定义函数. 定义一个函数 可以定义一个由自己想要功能的函数,以下是简单的规则: 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 (). 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数. 函数的第一行语句可以选择性地使用文