Python参数的传递

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

一、参数的传递 

python传参,Python,java,开发语言

函数的参数传递本质上就是:从实参到形参的赋值操作。Python中“一切皆对象”,所有的赋值操作都是“引用的赋值”。所以,Python中参数的传递都是“引用传递”,不是“值传递”。

具体操作时分为两类:

  1. 对“可变对象”进行“写操作”,直接作用于原对象本身。
  2. 对“不可变对象”进行“写操作”,会产生一个新的“对象空间”,并用新的值填充这块空间。
  • 可变对象有:

字典、列表、集合、自定义的对象等

  • 不可变对象有:

数字、字符串、元组、function等

二、传递可变对象的引用

传递参数是可变对象(例如:列表、字典、自定义的其他可变对象等),实际传递的还是对象的引用。在函数体中不创建新的对象拷贝,而是可以直接修改所传递的对象。

【操作】参数传递:传递可变对象的引用

b = [10,20]
def f2(m):
  print("m:",id(m))    #b和m是同一个对象
  m.append(30)  #由于m是可变对象,不创建对象拷贝,直接修改这个对象
​
f2(b)
print("b:",id(b))
print(b)

执行结果:

m: 45765960

b: 45765960

[10, 20, 30]

三、传递不可变对象的引用

传递参数是不可变对象(例如:intfloat、字符串、元组、布尔值),实际传递的还是对象的引用。在”赋值操作”时,由于不可变对象无法修改,系统会新创建一个对象。

【操作】参数传递:传递不可变对象的引用

a = 100
def f1(n):
  print("n:",id(n))    #传递进来的是a对象的地址
  n = n+200      #由于a是不可变对象,因此创建新的对象n
  print("n:",id(n))  #n已经变成了新的对象
  print(n)
f1(a)
print("a:",id(a))

执行结果:

n: 1663816464

n: 46608592

300

a: 1663816464

显然,通过id值我们可以看到na一开始是同一个对象。给n赋值后,n是新的对象。

四、浅拷贝和深拷贝

python传参,Python,java,开发语言

为了更深入的了解参数传递的底层原理,我们需要讲解一下“浅拷贝和深拷贝”。我们可以使用内置函数:copy(浅拷贝)、deepcopy(深拷贝)。

  1. 浅拷贝:拷贝对象,但不拷贝子对象的内容,只是拷贝子对象的引用。
  2. 深拷贝:拷贝对象,并且会连子对象的内存也全部(递归)拷贝一份,对子对象的修改不会影响源对象
#测试浅拷贝和深拷贝
import copy
​
def testCopy():
  '''测试浅拷贝'''
  a = [10, 20, [5, 6]]
  b = copy.copy(a)
​
  print("a", a)
  print("b", b)
  b.append(30)
  b[2].append(7)
  print("浅拷贝......")
  print("a", a)
  print("b", b)
​
def testDeepCopy():
  '''测试深拷贝'''
  a = [10, 20, [5, 6]]
  b = copy.deepcopy(a)
​
  print("a", a)
  print("b", b)
  b.append(30)
  b[2].append(7)
  print("深拷贝......")
  print("a", a)
  print("b", b)
​
testCopy()
print("*************")
testDeepCopy()

运行结果:

a [10, 20, [5, 6]]

b [10, 20, [5, 6]]

浅拷贝......

a [10, 20, [5, 6, 7]]

b [10, 20, [5, 6, 7], 30]


a [10, 20, [5, 6]]

b [10, 20, [5, 6]]

深拷贝......

a [10, 20, [5, 6]]

b [10, 20, [5, 6, 7], 30]

 五、传递不可变对象包含的子对象是可变的情况

#传递不可变对象时。不可变对象里面包含的子对象是可变的。则方法内修改了这个可变对象,源对象也发生了变化。
​
a = (10,20,[5,6])
print("a:",id(a))
​
def test01(m):
  print("m:",id(m))
  m[2][0] = 888
  print(m)
  print("m:",id(m))
​
test01(a)
print(a)

运行结果:

a: 41611632

m: 41611632

(10, 20, [888, 6])文章来源地址https://www.toymoban.com/news/detail-625419.html

m: 41611632

(10, 20, [888, 6])

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

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

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

相关文章

  • python是如何进行参数传递的?

    在分析python的参数传递是如何进行的之前,我们需要先来了解一下,python变量和赋值的基本原理,这样有助于我们更好的理解参数传递。 python变量以及赋值 数值 从几行代码开始 我们先将1赋值给a,也就是a指向了1这个对象, 在python中一切皆对象 。接着b=a,则表示让b也指向

    2024年02月14日
    浏览(48)
  • Java开发学习(二十五)----使用PostMan完成不同类型参数传递

    学习路线指引(点击解锁) 知识定位 人群定位 🧡 Python实战微信订餐小程序 🧡 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 💛Python量化交易实战💛 入门级 手把手带你打造一个易扩展、更安全、效率更高的量

    2023年04月09日
    浏览(50)
  • python中的形参和实参以及参数传递方式

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

    2024年02月02日
    浏览(43)
  • Python初学者友好丨详解参数传递类型

    摘要:  本文清晰地解释了Python中的不同参数传递类型,并提供了示例代码来说明每种类型的用法。对于初学者或不清楚Python传参的读者们来说是非常有益的,文中提供了足够的信息来理解和使用Python中的函数参数传递。 本文分享自华为云社区《提升Python函数调用灵活性:参

    2024年02月09日
    浏览(45)
  • 【vue2第十七章】VueRouter 编程式导航跳转传参(点击按钮跳转路由和如何传递参数)

    如何在js进行跳转路由 在一些需求中,我们需要不用点击a标签或者router-link,但是也要实现路由跳转,比如登陆,点击按钮搜索跳转。那么这种情况如何进行跳转呢? 直接再按钮绑定的方法中写 this.$router.push(\\\'路由路径\\\') 即可。 代码示范 this.$router.push(\\\"/跳转路径\\\") 或者 this

    2024年02月09日
    浏览(43)
  • Python | 爬虫的request.post如何传递json参数

    例如: 这里通过json参数传递了一个字典类型的data数据,在请求头中设置Content-Type为application/json。requests会自动将json参数转化为合法的JSON格式,并且将其作为请求体提交给服务器。注意,这里的json参数是requests库中的内置参数之一,表示将请求体数据序列化为JSON格式。 在服

    2024年02月11日
    浏览(38)
  • 【Python】函数进阶 ① ( 函数返回多个返回值 | 函数参数传递类型简介 | 位置参数 | 关键字参数 )

    在函数中 , 如果要 返回 多个返回值 , 可以 在 return 语句中 , 设置多个返回值 , 这些返回值之间使用 逗号 隔开 , 这些返回值的类型是 元组 tuple 类型的 ; 在下面的代码中 , 返回了 3 个返回值 , 其 本质上是返回了一个包含 3 个元素的 元组 数据容器 , 可以使用多重赋值将返回的

    2024年02月11日
    浏览(56)
  • python:使用RESTful API(flask)调用python程序传递参数,实现Web端调用python程序

    现有一个用python写的程序(或者是一个或几个的函数接口),需要在Web前端调用python写的函数。如果直接用前端java来调用会很不方便,而且会出现各种麻烦的问题,下面给出如何在web前端调用python的接口。 使用python的RESTful API库将python写的函数封装为Web端可调用的接口,在

    2024年01月20日
    浏览(45)
  • Java调用python项目(传参、不传参、服务器)

    一、无参数调用举例 创建一个python文件,写入如下代码: 创建一个Java文件 编写入如下代码(代码的意思已经添加注释) 3、结果如下说明运行成功 二、有参数时调用举例 1、创建Java文件并写入代码 2、创建python文件并写入代码 运行结果如下说明调用成功! 三、将Python脚本

    2024年02月04日
    浏览(45)
  • python通过ctypes传参numpy给c语言函数

    gcc -o demo.so -std=c++11 -shared -fPIC demo.c  python3 main.py 概述: 示例实现了numpy数组加上100并通过另外的数组的指针获取返回值。主要过程是 numpy数组转换成c_void_p类型,然后传参给c语言函数,c语言函数中指针强转到需要的数据类型,然后再处理。这样即可改变numpy数组中的数值实

    2024年02月12日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包