python中的形参和实参以及参数传递方式

这篇具有很好参考价值的文章主要介绍了python中的形参和实参以及参数传递方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1

在编程语言中,函数定义时用的是形参,调用时用的是实参。

形参,全称为"形式参数",不是实际存在的变量,又称虚拟变量。形参是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数

实参,全称为"实际参数",是在调用时传递给函数的参数。实参可以是常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。

形参和实参的功能是数据传送。

2

调用函数时,实参将赋值给形参。必须注意实参的个数、类型应与形参要一一对应,并且实参必须要有确定的值。形参的作用域一般仅限函数体内部,而实参的作用域根据实际设置而定。

Python语言中提供了一种关键字参数的机制,可以给开发者提供更大的灵活性。如函数func()定义时形式参数的顺序是func(x, y),但是调用时实际参数的顺序可以是func(y = 1, x = 2)。

3

在函数调用中,实参的值被传递给函数的形参。这个过程确实涉及到将一个值赋给一个变量,因此可以看作是一种赋值操作。实参的值被赋给相应的形参,使得函数在执行时可以使用这些值。

然而,传递参数的过程与一般的赋值操作还有一些不同之处:

1形参和实参是独立的变量:当实参的值传递给形参时,它们在内存中是独立的变量。修改形参的值不会影响实参的值,因为它们是两个不同的变量。

2传递方式:参数传递可以是按值传递(pass-by-value)或按引用传递(pass-by-reference),这取决于编程语言的特性。在按值传递的情况下,实参的值被复制到形参中,对形参的修改不会影响实参。而在按引用传递的情况下,实参的引用(地址)被传递给形参,对形参的修改会影响实参。

在Python中,实际上是按对象引用传递(pass-by-object-reference)的,而不是按引用传递。这意味着对象的引用被传递给函数的形参,形参和实参引用同一个对象。实参的引用被传递给形参,函数内部可以通过形参来访问和修改实参所引用的对象。当传递可变对象(如列表或字典)时,对形参对象的修改会影响实参。但是当传递不可变对象(如数字、字符串或元组)时,形参的修改不会影响实参,因为不可变对象是无法修改的。

注意,对可变对象的修改是指对可变对象的原地修改。

Python的参数引用机制被认为是其设计的亮点之一。

通过按对象引用传递参数,Python能够在函数调用过程中高效地处理对象,同时提供了灵活性和直观性。以下是一些Python参数引用机制的优点:

1对象共享:通过引用传递,多个变量可以引用相同的对象。这意味着可以节省内存,并且对于可变对象,多个变量可以同时对其进行操作。

2不可变对象的安全性:对于不可变对象(如数字、字符串、元组),保证了其值不会被函数修改,从而避免了潜在的副作用。

3可变对象的直接修改:对于可变对象(如列表、字典),函数内部对形参对象的修改会直接反映在实参上,无需使用返回值来获取修改后的结果。

4函数副作用控制:由于参数传递是按对象引用传递的,函数可以通过修改可变对象来产生副作用,但对于不可变对象,函数无法修改实参的值。

4

参数分为可变类型和不可变类型,其调用结果是不同的。

(1)可变类型:类似c++的引用传递,如列表、字典等。如果传递的参数是可变类型,则在函数内部对传入参数的修改会影响到外部变量。

(2)不可变类型:类似c++的值传递,如整数、字符串、元组等。如果传递的参数是不可变类型,则在函数内部对传入参数的修改不会影响到外部变量。

5

可给每个形参指定默认值。

def enroll(name, gender, age='18', city='Beijing'):

定义时必选参数在前,默认参数在后。默认参数在调用时可省略。

默认参数必须指向不可变对象,否则可能会出现错误

def test_add(a=[]):
    a.append('END')
    return a



print(test_add([1, 2, 3]))
print(test_add(['a', 'b', 'c']))
print(test_add())
print(test_add())
print(test_add())



结果:

[1, 2, 3, 'END']
['a', 'b', 'c', 'END']
['END']
['END', 'END']
['END', 'END', 'END']

默认参数是空列表[],但是函数test_add()似乎每次都“记住了”上次添加了’END’后的list。这是因为在Python语言中,函数在定义的时候,默认参数的值就被计算出来了,它指向对象[]。每次调用该函数,如果改变了其内容,则下次调用时,就不再是函数定义时的[]了。

开发者也可以用None这个不可变对象来解决错误,如下代码所示。

def test_add(H=None):
    if H is None:
        H = []
    H.append('END')
    return H


print(test_add())
print(test_add())

结果:
['END']
['END']

对于str、None等类似的不可变对象一旦创建,其内部数据就不能修改,这样就减少了由于修改数据导致的错误。此外,由于对象不变,多线程环境下同时读取对象不需要加锁,同时读也没有问题。开发者在编写程序时,如果可以设计一个不可变对象,就尽量设计成不可变对象。

6

is 是一个用于比较对象身份的操作符。它用于检查两个对象是否引用同一个内存位置,也就是它们是否是同一个对象。具体来说,当使用 is 操作符时,它会检查两个对象的身份标识是否相同,而不是比较它们的值。如果两个对象具有相同的身份标识,即它们引用同一个内存地址,则 is 操作符返回 True。如果两个对象的身份标识不同,则返回 False。

a = [1, 2, 3]
b = a
c = [1, 2, 3]


print(a is b)  # 输出 True,a和b引用同一个列表对象
print(a is c)  # 输出 False,a和c引用不同的列表对象

需要注意的是,is 操作符用于比较对象的身份标识,而 == 操作符用于比较对象的值。文章来源地址https://www.toymoban.com/news/detail-785742.html

到了这里,关于python中的形参和实参以及参数传递方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java参数传递方式详解

    Java中参数传递的方式是什么样的呢?是值传递还是引用传递呢? 答案是值传递。 为什么呢? 先来了解一些基础。。。。。 Java中参数传递方式是值传递,且只有值传递,没有引用传递。 JavaGuide Java值传递详解

    2024年02月07日
    浏览(53)
  • 第49讲:Python函数调用解析:传参方式、实参与形参关系、多返回值示例

    调用函数时,需要传递实际参数到函数里的形参中,可以根据每个形参在所有形参中的位置,从而传递实参到对应位置的形参中。 位置实参指的就是,将实参作为变量值赋值给对应位置的形参变量,例如第一个形参变量,调用函数时传入的第一个实参就会赋值给函数中的第一

    2024年02月09日
    浏览(48)
  • Pytest fixture参数传递的4种方式

    最近使用Pytest中的fixture和conftest时,遇到需要在conftest中的setup和teardown方法里传递参数。这里记录以下4种实现的方式。 结果: 结果: 结果:

    2024年02月16日
    浏览(34)
  • Python 中的 TypeError: an integer is required 错误通常是由于我们在代码中使用整数(integer)参数的地方实际上传递

    Python 中的 TypeError: an integer is required 错误通常是由于我们在代码中使用整数(integer)参数的地方实际上传递了非整数类型的参数,例如字符串(string)或浮点数(float)。这个错误可以在编写 Python 程序时遇到,但也可能是在编写 Python 脚本时遇到。 下面是解决 TypeError: an i

    2024年02月15日
    浏览(42)
  • 小程序跨页面传递参数的几种方式

    当我们在开发小程序时,经常会遇到需要在不同页面之间传递数据的情况。为了实现页面间的数据传递,小程序提供了多种方法。下面将介绍几种常用的传递数据的方法。 URL参数传递:这是一种简单直接的传递数据的方式。在跳转页面时,可以在URL中添加参数来传递数据。在

    2024年02月08日
    浏览(40)
  • axios 传递参数的方式(data 与 params)

    提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 工作案例:在 vue 项目使用 axios 传递参数的方式(data 与 params) 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 提示:这里可以添加本文要记录的大概内容: 工作中,用到的传递

    2024年04月17日
    浏览(30)
  • 若依框架前后端各个请求方式参数传递示例

    封装方法getBanner getBanner方法调用(customerBannerId是一个数字) 后端接口(@PathVariable 注解取得请求路径中的参数,注意此处的三个参数名要一致) 封装方法getBanner getBanner 方法调用(customerBannerId是一个对象,这里属性名与属性值一致,简写) 后端接口(前端传递的对象的属性

    2024年02月03日
    浏览(50)
  • C++ 参数的三种传递方式和应用参加

    C++ 参数的三种传递方式分别是 值传递 、 指针传递 和 引用传递 。 值传递 值传递的实质 将实参的值(a、b)复制到形参(m、n)相应的存储单元中,即形参和实参分别占用不同的存储单元。 值传递的特点 值传递的特点是单向传递,即主调函数被调用时给形参分配存储单元,把

    2024年02月08日
    浏览(34)
  • Controller 中的参数传递

    目录 get请求 测试结果 基本数据类型与引用数据类型 自定义数据类型   json 数据类型  post 请求 测试结果 基本数据类型与引用数据类型 自定义数据类型 ​编辑 json 数据类型  put 请求 测试结果 基本数据类型和引用数据类型  自定义数据类型  json 数据类型 delete 请求 测试

    2024年02月12日
    浏览(39)
  • 【使用multipart/form-data方式传递MultipartFile参数,实现服务间文件的传递】

    目录 一、代码实现 二、MultipartFile工具类 三、HttpClient使用 四、参考链接 一、代码实现 1、A服务接收前端上传文件并发送至B服务 引入依赖 使用MultipartFile接收前端文件 调取第三方接口,发送 MultipartFile 文件 2、B服务接收文件 二、MultipartFile工具类 简介:MultipartFile是SpringMV

    2024年02月12日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包