python 引用传递和值传递详解(实参,形参)


Posted in Python onJune 05, 2020

python中函数参数是引用传递(不是值传递)。对于不可变类型,因变量不能被修改,所以运算时不会影响到变量本身;而对于可变类型来说,函数体中的运算有可能会更改传入的参数变量.

python 引用传递和值传递详解(实参,形参)

python 引用传递和值传递详解(实参,形参)

形参: 函数需要传递的参数

实参:调用函数时传递的参数

补充知识:python函数方法实参给形参传值时候的隐形‘陷阱'

众所周知,在python函数里面参数分为形参,实参两种。形参当然了就是形式参数,而实参是我们需要给这个函数传入的变量,在我们给实参传入变量之后,调用函数,实参则自动会把数值或则变量赋予形参,从而通过函数得出我们想要的结果。既然形参是由实参赋值传递,所以说形参的位置顺序至关重要,稍有疏忽,程序可能就会出错。那么下面就来帮大家在初学的时候如何让更好的避开这些隐形的陷阱。

首先,形参分为 必选参数,默认参数,可变参数(*args),命名关键字参数,关键字参数(**kwargs)。

1.必选参数

传值的时候,必须按照顺序依次传入数值

先写一个下面的函数:

def power(m, n):
  result=1
  while n>0:
    n=n-1
    result=result*m
  return result
 
# 调用函数并输出结果
print(power(4,3))

在上面程序中,形参有两个m,n,所以我们在传入参数的时候,必须按照顺序依次分别传入参数

2.默认参数

在形参中直接给予赋值,调用时,不用赋值程序也能接收到这个参数,当然你调用时可以重新赋值,那程序接收的也是你重新赋值的参数。

def power(m, n=3):
  result=1
  while n>0:
    n=n-1
    result=result*m
  return result
 
# 调用函数并输出结果
print(power(4))

这个程序里面,n就为默认参数,我们在大部分时候使用默认参数,就是因为它有能降低调用函数难度的好处。

3.可变参数

就是说我们在传入参数的时候,传入的参数超出了必选参数,那么多余的参数就会被放入到一个元组里面,那么这些多余的参数就称为可变参数*args

def power(*args):
  result=0
  for n in args:
    result=result+n*n
  return result
 
# 调用函数
tupleArray=(1,2,3)
# *tupleArray这种方式很常见,很重要
print(power(*tupleArray))

这个应该很好理解,比较简单。

4.命名关键字参数

所谓的命名关键字参数就是在形参里面我们有一个对应的形参符号,然后在传入参数的时候,我们以形参符号赋值的形式传入参数,这样做就是能让我们避免因顺序错误产生的程序错误。如这种形式:b=‘你好'

如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:

def person(name, age, *args, city, job):

print(name, age, args, city, job)

5.关键字参数

关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。在调用函数时,可以只传入必选参数:

作用:扩展函数的功能 特征:**kw

def person(name, age, **kw):

print('name:', name, 'age:', age, 'other:', kw)

案例一:

person('Michael', 30)

name: Michael age: 30 other: {}

案例二:

#定义一个字典数据
dictArray = {'city': 'Beijing', 'job': 'Engineer'}
#调用函数
person('Jack', 24, **dictArray )
#输出结果
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}

6.参数组合

参数组合就是说在命名函数的时候,形参可以包含必选参数,默认参数,可变参数,命名关键字参数,关键字参数。 但是在用这个五个参数的时候,一定一定要谨记,这个五个参数的传入顺序一定为 必选参数,默认参数,可变参数,命名关键字参数,关键字参数。否则 程序一定会出错。

比如定义一个函数,包含若干种参数:

def f1(a, b, c=0, *args, **kw):
  print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
 
def f2(a, b, c=0, *, d, **kw):
  print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)

在函数调用的时候,Python解释器自动按照参数位置和参数名把对应的参数传进去。

>>> f1(1, 2)
a = 1 b = 2 c = 0 args = () kw = {}
>>> f1(1, 2, c=3)
a = 1 b = 2 c = 3 args = () kw = {}
>>> f1(1, 2, 3, 'a', 'b')
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {}
>>> f1(1, 2, 3, 'a', 'b', x=99)
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x': 99}
>>> f2(1, 2, d=99, ext=None)
a = 1 b = 2 c = 0 d = 99 kw = {'ext': None}

总结:

1,Python的函数具有非常灵活的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数。

2,默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误!

3,要注意定义可变参数和关键字参数的语法:

*args是可变参数,args接收的是一个tuple;

**kw是关键字参数,kw接收的是一个dict。

4,以及调用函数时如何传入可变参数和关键字参数的语法:

可变参数既可以直接传入:func(1, 2, 3),又可以先组装list或tuple,再通过*args传入:func(*(1, 2, 3));

关键字参数既可以直接传入:func(a=1, b=2),又可以先组装dict,再通过**kw传入:func(**{'a': 1, 'b': 2})。

5,使用*args和**kw是Python的习惯写法,当然也可以用其他参数名,但最好使用习惯用法。

6,命名的关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。

7,定义命名的关键字参数在没有可变参数的情况下不要忘了写分隔符*,否则定义的将是位置参数。

以上这篇python 引用传递和值传递详解(实参,形参)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用python获取CPU和内存信息的思路与实现(linux系统)
Jan 03 Python
Python多线程实例教程
Sep 06 Python
python多重继承实例
Oct 11 Python
Python 3.6 性能测试框架Locust安装及使用方法(详解)
Oct 11 Python
python 中的list和array的不同之处及转换问题
Mar 13 Python
Python使用pymongo模块操作MongoDB的方法示例
Jul 20 Python
浅谈python连续赋值可能引发的错误
Nov 10 Python
使用matplotlib中scatter方法画散点图
Mar 19 Python
Python中xml和dict格式转换的示例代码
Nov 07 Python
python使用pygame实现笑脸乒乓球弹珠球游戏
Nov 25 Python
Python 实现将大图切片成小图,将小图组合成大图的例子
Mar 14 Python
Django 项目布局方法(值得推荐)
Mar 22 Python
Python检测端口IP字符串是否合法
Jun 05 #Python
Python如何基于Tesseract实现识别文字功能
Jun 05 #Python
如何导出python安装的所有模块名称和版本号到文件中
Jun 05 #Python
在python中list作函数形参,防止被实参修改的实现方法
Jun 05 #Python
pycharm远程连接vagrant虚拟机中mariadb数据库
Jun 05 #Python
浅谈python 调用open()打开文件时路径出错的原因
Jun 05 #Python
Python命名空间namespace及作用域原理解析
Jun 05 #Python
You might like
PHP 字符串加密函数(在指定时间内加密还原字符串,超时无法还原)
2010/04/28 PHP
php debug 安装技巧
2011/04/30 PHP
mantis安装、配置和使用中的问题小结
2014/07/14 PHP
php实现将wav文件转换成图像文件并在页面中显示的方法
2015/04/21 PHP
Laravel中注册Facades的步骤详解
2016/03/16 PHP
thinkPHP批量删除的实现方法分析
2016/11/09 PHP
关于php 高并发解决的一点思路
2017/04/16 PHP
jQuery滚动加载图片效果的实现
2013/03/06 Javascript
js调试系列 控制台命令行API使用方法
2014/06/18 Javascript
JS+CSS实现可以凹陷显示选中单元格的方法
2015/03/02 Javascript
谈谈encodeURI和encodeURIComponent以及escape的区别与应用
2015/11/24 Javascript
jquery 点击元素后,滚动条滚动至该元素位置的方法
2016/08/05 Javascript
BOM系列第三篇之定时器应用(时钟、倒计时、秒表和闹钟)
2016/08/17 Javascript
Javascript之面向对象--封装
2016/12/02 Javascript
JS焦点图,JS 多个页面放多个焦点图的实例
2016/12/08 Javascript
解决同一页面中两个iframe互相调用jquery,js函数的方法
2016/12/12 Javascript
Vue2.0 v-for filter列表过滤功能的实现
2018/09/07 Javascript
this在vue和小程序中的使用详解
2019/01/28 Javascript
JS使用数组实现的队列功能示例
2019/03/04 Javascript
JavaScript实现单英文金山打字通
2020/07/24 Javascript
Vue Components 数字键盘的实现
2019/09/18 Javascript
vue通过v-html指令渲染的富文本无法修改样式的解决方案
2020/05/20 Javascript
Vue使用预渲染代替SSR的方法
2020/07/02 Javascript
python使用正则搜索字符串或文件中的浮点数代码实例
2014/07/11 Python
python3实现全角和半角字符转换的方法示例
2017/09/21 Python
详解Python数据分析--Pandas知识点
2019/03/23 Python
python中break、continue 、exit() 、pass终止循环的区别详解
2019/07/08 Python
解决python有时候import不了当前的包问题
2019/08/28 Python
pyqt5、qtdesigner安装和环境设置教程
2019/09/25 Python
python_matplotlib改变横坐标和纵坐标上的刻度(ticks)方式
2020/05/16 Python
python简单实现9宫格图片实例
2020/09/03 Python
Urban Outfitters英国官网:美国平价服饰品牌
2016/11/25 全球购物
捷克钓鱼用品网上商店:Parys.cz
2018/06/15 全球购物
家居装修公司创业计划书范文
2014/03/20 职场文书
幼儿园安全教育月活动总结
2015/05/08 职场文书
详解CSS中的特指度和层叠问题
2021/07/15 HTML / CSS