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 相关文章推荐
python3编写C/S网络程序实例教程
Aug 25 Python
python通过自定义isnumber函数判断字符串是否为数字的方法
Apr 23 Python
python socket多线程通讯实例分析(聊天室)
Apr 06 Python
利用Python开发实现简单的记事本
Nov 15 Python
解决pyqt中ui编译成窗体.py中文乱码的问题
Dec 23 Python
python将ansible配置转为json格式实例代码
May 15 Python
对python cv2批量灰度图片并保存的实例讲解
Nov 09 Python
Python将字符串常量转化为变量方法总结
Mar 17 Python
基于pandas中expand的作用详解
Dec 17 Python
Django用户身份验证完成示例代码
Apr 03 Python
查看已安装tensorflow版本的方法示例
Apr 19 Python
Django如何实现防止XSS攻击
Oct 13 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
星际原理概述
2020/03/04 星际争霸
一个php作的文本留言本的例子(六)
2006/10/09 PHP
中国站长站 For Dede4.0 采集规则
2007/05/27 PHP
Zend 输出产生XML解析错误
2009/03/03 PHP
用php获取本周,上周,本月,上月,本季度日期的代码
2009/08/05 PHP
php中将数组存到文件里的实现代码
2012/01/19 PHP
php学习笔记之mb_strstr的基本使用
2018/02/03 PHP
PHP的PDO大对象(LOBs)
2019/01/27 PHP
php使用Swoole实现毫秒级定时任务的方法
2020/09/04 PHP
新手入门常用代码集锦
2007/01/11 Javascript
javaScript矢量图表库-gRaphael几行代码实现精美的条形图/饼图/点图/曲线图
2013/01/09 Javascript
js中 关于undefined和null的区别介绍
2013/04/16 Javascript
jQuery学习笔记之 Ajax操作篇(二) - 数据传递
2014/06/23 Javascript
JS实现1000以内被3或5整除的数字之和
2016/02/18 Javascript
bootstrap输入框组代码分享
2016/06/07 Javascript
Javascript同时声明一连串(多个)变量的方法
2017/01/23 Javascript
vue实现element-ui对话框可拖拽功能
2018/08/17 Javascript
关于微信公众号开发无法支付的问题解决
2018/12/28 Javascript
JavaScript实现联动菜单特效
2020/01/07 Javascript
jenkins自动构建发布vue项目的方法步骤
2021/01/04 Vue.js
[53:13]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第三场 1月18日
2021/03/11 DOTA
Python变量和字符串详解
2017/04/29 Python
Python对列表去重的多种方法(四种方法)
2017/12/05 Python
python数据分析数据标准化及离散化详解
2018/02/26 Python
使用python对文件中的单词进行提取的方法示例
2018/12/21 Python
Pyqt5 基本界面组件之inputDialog的使用
2019/06/25 Python
使用spring mvc+localResizeIMG实现HTML5端图片压缩上传的功能
2016/12/16 HTML / CSS
米兰必去买手店排行榜首位:Antonioli
2016/09/11 全球购物
爱淘宝:淘宝网购物分享平台
2017/04/28 全球购物
美国高档百货Nordstrom的折扣店:Nordstrom Rack
2017/11/13 全球购物
关于期中考试的反思
2014/02/02 职场文书
社区反邪教工作方案
2014/06/16 职场文书
幼儿园2014年度工作总结
2014/11/10 职场文书
php 解析非标准json、非规范json
2021/04/01 PHP
Nginx内网单机反向代理的实现
2021/11/07 Servers