Python一一参数

参数

传递参数

(1).参数的传递是通过自动将对象赋值给本地变量名来实现的。所有的参数实际上都是通过指针进行传递的。作为参数被传递的对象从来不自动拷贝。

(2).在函数内部的参数名的赋值不会影响调用者

(3).改变函数的可变对象参数的值也许会对调用者有影响。因为参数是简单地赋值给传入的对象,函数能够就地改变传入的可变对象。因此其结果会影响调用者。可变参数对于函数来说是可以做输入和输出的。

Python的通过赋值进行传递的机制与C++的引用参数选项并不完全相同,但是在实际中,它与C语言的参数传递模型相当相似。

(1).不可变参数“通过值”进行传递。像整数和字符串这样的对象是通过对象引用而不是拷贝进行传递的,但是因为你无论怎样都不可能在原处改变不可变对象,实际效果就很像创建了一份拷贝。

(2).可变对象是通过“指针”进行传递的。例如,列表和字典这样的对象也是通过对象引用进行传递的,这一点与C语言使用指针传递数组很相似:可变对象能够在函数内部进行原处改变,这一点与C数组很像。

参数和共享引用

因为a是在函数作用域内的本地变量名,第一个赋值对函数调用者没有影响,它仅仅把本地变量a修改为引用一个完全不同的对象,并没有改变调用者作用域中的名称X的绑定。

b也是一个本地变量名,但是它被传给一个可变对象,因为第二个赋值是一个在原处发生的对象改变,对函数中b[0]进行赋值的结果会在函数返回后影响L的值。

避免可变参数的修改

如果不想要函数内部在原处的修改影响传递给它的对象,那么,我们可以简单地创建一个明确的可变对象的拷贝。

如果不想改变传入的对象,我们可以在函数内部进行拷贝:

为了真正意义上防止这些改变,我们总是能够将可变对象转换为不可变对象来杜绝这种问题,例如,将其转换为元组(不可变属性),这样在试图改变时,会触发异常:

如果在你没有预期的情况下对象在外部发生了改变,检查一下是不是一个调用了的函数引起的,并且有必要的话当传入对象时进行拷贝。

对参数输出进行模拟

返回一个包含两个元素的元组,它的括号是可选的,这里省略了。

特定的参数匹配模型

基础知识

关于参数匹配模型的一些大纲:

(1).位置从左至右进行匹配

(2).关键字参数:通过参数名进行匹配(使用name = value语法)

(3).默认参数:为没有传入值的参数定义参数值(使用name = value语法)

(4).可变参数:收集任意多基于位置或关键字的参数(以字符*开头,收集任意多的额外参数)

(5).可变参数解包:传递任意多的基于位置或关键字的参数(调用者能够再使用*语法去将参数集合打散,分成参数。这个*与在函数头部的*恰恰相反:在函数头部意味着收集任意多的参数,而在调用者中意味着传递任意多的参数。)

(6).Keyword-only参数:参数必须按照名称传递(在Python3.0中,函数也可以指定参数,参数必须用带有关键参数的名字(而不是位置)来传递。)

匹配语法

细节

Python遵从下面法则:

(1).在函数调用中,参数必须以此顺序出现:任何位置参数(value),后面跟着任何关键字参数(name=value)和*sequence形式的组合,后面跟着**dict形式

(2).在函数头部,参数必须以此顺序出现:任何一般参数(name),紧跟着任何默认参数(name=value),如果有的话,后面是*name(或者在Python3.0中是*)的形式,后面跟着任何name或name=value keyword-only参数(在Python3.0中),后面跟着**name形式。

Python内部是使用以下的步骤来在赋值前进行参数匹配的:

(1).通过位置分配非关键字参数

(2).通过匹配变量名分配关键字参数

(3).其他额外的非关键字参数分配到*name元组中

(4).其他额外的关键字参数分配到**name字典中

(5).用默认值分配给在头部未得到分配的参数

关键字参数和默认参数的实例

首先我们看通过位置从左至右匹配变量名

关键字参数

关键字参数允许通过变量名

默认参数

关于函数头部和函数调用中特定的name=value语法:

在函数头部:为一个可选的参数定义默认值

在函数调用:通过变量名进行匹配的关键字

这两种情况都不是一个赋值语句,它是在这两种情况下的特定语法,改变了默认的参数匹配机制。

关键字参数和默认参数的混合

任意参数的实例(*和**)

收集参数(函数定义中使用*)

第一种用法:在元组中收集不匹配的位置参数

第二种用法:**允许将关键字参数转换为字典,你能够在之后使用键调用进行步进或字典迭代

第三种:混合用法

解包参数(函数调用中使用*)

Python3.0 Keyword-Only参数

keyword-only参数一一即必须只按照关键字传递并且不会由一个位置参数来填充的参数。如果想要一个函数既处理任意多个参数,也接受可能的配置选项的话,这是很有用的。

语法:keyword-only参数编码为命名的参数,出现在参数列表中的*args之后。所有这些参数都必须在调用中使用关键字语法来传递

排序规则

注意:keyword-only参数必须在一个星号后面指定,而不是两个星号一一命名的参数不能出现在**args任意关键字形式的后面,而且一个**不能独自出现在参数列表中,这两种做法都将产生语法错误:

上述规则意味着:

在一个函数头部:keyword-only参数必须编写在**args任意关键字形式之前,且在*args任意位置形式之后。

在函数调用中:当传递keyword-only参数时,它们必须出现在一个**args形式之前。keyword-only参数可以编写在*args之前或者之后,并且可能包含在**args中:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值