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 引用传递和值传递详解(实参,形参)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Python的形参和实参使用方式

    形参可以设置参数默认值,设置遵循从右至左原则 例如:fun(x=0,y=1),fun(x,y=1),但不可以是fun(x=1,y) 形参设置可以为数字字符串变量.元组和字典等任意类型数据,元组形参是在变量名前加*,字典形参是在变量名前加** 例如:fun(var),fun(*tuple),fun(*list),fun(**dict) 实参接受也可以是任意类型数据,当接收数据为元组列表或者字典时,同样是在数据变量前加*和** 例如:fun(x),fun(*seq),fun(*list),fun(*

  • Python参数传递机制传值和传引用原理详解

    首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传递. 值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本.值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值. 引用传递(pass-

  • python进行参数传递的方法

    在分析python的参数传递是如何进行的之前,我们需要先来了解一下,python变量和赋值的基本原理,这样有助于我们更好的理解参数传递. python变量以及赋值 数值 从几行代码开始 In [1]: a = 1 In [2]: b = a In [3]: a = a + 1 我们先将1赋值给a,也就是a指向了1这个对象,在python中一切皆对象.接着b=a,则表示让b也指向了1这个对象,python中一个对象是可以被多个引用所指向.最后执行的a=a+1,这里需要注意一点,python的数据类

  • 深入理解python中函数传递参数是值传递还是引用传递

    目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是"传对象引用"的方式.实际上,这种方式相当于传值和传引用的一种综合.如果函数收到的是一个可变对象(比如字典 或者列表)的引用,就能修改对象的原始值--相当于通过"传引用"来传递对象.如果函数收到的是一个不可变对象(比如数字.字符或者元组)的引用,就不能 直接修改原始对象--相当于通过"传值"来传递对象. 你可以在很多讨论该问题

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

    python中函数参数是引用传递(不是值传递).对于不可变类型,因变量不能被修改,所以运算时不会影响到变量本身:而对于可变类型来说,函数体中的运算有可能会更改传入的参数变量. 形参: 函数需要传递的参数 实参:调用函数时传递的参数 补充知识:python函数方法实参给形参传值时候的隐形'陷阱' 众所周知,在python函数里面参数分为形参,实参两种.形参当然了就是形式参数,而实参是我们需要给这个函数传入的变量,在我们给实参传入变量之后,调用函数,实参则自动会把数值或则变量赋予形参,从而通过函数得

  • Python处理键映射值操作详解

    目录 1. 问题背景 2. collections 概述 2.1 什么是collections 2.2 Collections 内部结构 2.3 collections 使用方法 3. defaultdict 方法 setdefault(),对字典key值赋默认值 defaultdict(),对字典进行查找取值 4. Counter 方法 总结 作为一个学完Python基础知识的测试,暗喜终于可以像RD们自己写脚本处理任何场景吧,如何优雅地写出来代码,接下来开启进阶版的Python. 本期浅谈一

  • python四则运算表达式求值示例详解

    目录 四则运算表达式求值 思路说明 算法步骤 代码 四则运算表达式求值 思路说明 使用双栈来实现——存放数值的栈 nums 与存放运算符的栈 ops. 算法步骤 对原始表达式字符串 exp 进行预处理, 将其转为一个元素对应一个数值或运算符的列表 explist. 遍历 explist , 每个元素依次压入对应的栈中. 每次压入后, 判断当前两栈顶是否可进行乘除运算.栈顶可进行乘除运算的充要条件是, ops 栈顶为<*> ,</> 之一, 且 nums 中的元素比 ops 中的元素

  • 利用Python如何生成hash值示例详解

    一.介绍 如果在Python中需要对用户输入的密码或者其他内容进行加密,首选的方法是生成hash值. 在Python中可以利用二个模块来进行: - crypt - hashlib 二.crypt (一)crypt的主要方法和常量 名称 描述 md5(-) 利用md5算法加密 sha1(-) 利用sha1算法加密 sha224(-) 利用sha224算法加密 sha256(-) 利用sha256算法加密 sha384(-) 利用sha384算法加密 sha512(-) 利用sha512算法加密 (

  • vue组件中使用props传递数据的实例详解

    在 Vue 中,父子组件的关系可以总结为 props向下传递,事件向上传递.父组件通过 props 给子组件下发数据,子组件通过事件给父组件发送消息.看看它们是怎么工作的.  一.基本用法 组件不仅仅是要把模板的内容进行复用,更重要的是组件间要进行通信. 在组件中,使用选项props 来声明需要从父级接收的数据, props 的值可以是两种, 一种是字符串数组,一种是对象. 1.1 字符串数组: <div id="app4"> <my-component4 messa

  • vuejs动态组件给子组件传递数据的方法详解

    通过子组件定义时候的props可以支持父组件给子组件传递数据,这些定义的props在子组件的标签中使用绑定属性即可,但是如果使用的是<component>动态组件,这个时候就没有显式的子组件标签,要给子组件传递数据需要在<component> 中进行绑定 <div class="app" id="deviceready"> <component :is="currentView" :user_name.s

  • PHP数组传递是值传递而非引用传递概念纠正

    在调用函数时通过将PHP数组作为实参赋给形参,在函数中修改,并不会影响到数组本身. 说明此过程中的传递为值传递,数组变量并非是指向此数组本身的引用,PHP数组本身以值的形式存在,同时形参是对数组的拷贝. 这点与其他一些语言不同(如c.Js等)很不相同,值得注意! 复制代码 代码如下: $arr = array( 'name' => 'corn', 'age' => '24', ); test_arr($arr); function test_arr($arr){ $arr['name'] =

  • String类型传递是值传递,char[]类型传递是引用传递的实现

    如下所示: package com.lstc.test; public class TestDemo3 { String str = new String("hello"); char[] ch = { 'a', 'b' }; public static void main(String[] args) { TestDemo3 t = new TestDemo3(); t.change(t.str, t.ch);//String是封装类,是值传递,char数组是引用传递 System.

  • JS引用传递与值传递的区别与用法分析

    本文实例讲述了JS引用传递与值传递的区别与用法.分享给大家供大家参考,具体如下: 这里详细解释JS值传递和引用传递以及二者的区别. 我们先来解释一下这两个的基本概念吧. 函数调用中,传递是一个数值,我们称为 "值传递". 函数调用中,传递是对象,一般称为 "引用传递". 现在这里总体上说明,这二者的本质区别就在于传递的数据类型不一样,值传递传递的是一个值,而引用传递传递的是一个对象. 看一下代码以及代码中的注释. 一.引入 function func(a) { a+

  • 对python修改xml文件的节点值方法详解

    这是我的xml文件结构 <?xml version='1.0' encoding='utf-8'?> <annotation> <folder>JPEGImages</folder> <filename>train_2018-05-08_1000.jpg</filename> <path>D:\all_data\2018-05-08\JPEGImages\train_2018-05-08_1000.jpg</path

随机推荐