Python参数的传递几种情况实例详解

 更新时间:2023年09月04日 10:49:21   作者:菜鸟之编程  
这篇文章主要给大家介绍了关于Python参数的传递的相关资料,在Python中传递参数指的是函数或方法中的参数传输方式,文中给出了详细的代码示例,需要的朋友可以参考下

一、参数的传递 

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

具体操作时分为两类:

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

可变对象有:

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

不可变对象有:

数字、字符串、元组、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]

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

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

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

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 值我们可以看到 n a 一开始是同一个对象。给n赋值后,n是新的对象。

四、浅拷贝和深拷贝

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

  • 浅拷贝:拷贝对象,但不拷贝子对象的内容,只是拷贝子对象的引用。
  • 深拷贝:拷贝对象,并且会连子对象的内存也全部(递归)拷贝一份,对子对象的修改不会影响源对象
#测试浅拷贝和深拷贝
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])

m: 41611632

(10, 20, [888, 6])

总结 

到此这篇关于Python参数的传递几种情况的文章就介绍到这了,更多相关Python参数传递内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python数据类型_元组、字典常用操作方法(介绍)

    python数据类型_元组、字典常用操作方法(介绍)

    下面小编就为大家带来一篇python数据类型_元组、字典常用操作方法(介绍)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • python中的函数递归和迭代原理解析

    python中的函数递归和迭代原理解析

    这篇文章主要介绍了python中的函数递归和迭代原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Python使用matplotlib的pie函数绘制饼状图功能示例

    Python使用matplotlib的pie函数绘制饼状图功能示例

    这篇文章主要介绍了Python使用matplotlib的pie函数绘制饼状图功能,结合实例形式分析了Python使用matplotlib的pie函数进行饼状图绘制的具体操作技巧,注释中对pie函数的用法进行了详细的说明,便于理解,需要的朋友可以参考下
    2018-01-01
  • wxPython实现绘图小例子

    wxPython实现绘图小例子

    这篇文章主要为大家详细介绍了wxPython实现绘图小例子,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • Web自动化之Selenium常用操作方法大全

    Web自动化之Selenium常用操作方法大全

    Selenium是一种自动化测试工具,可以用于测试Web应用程序,它提供了一组用于自动化Web浏览器进行测试的API,下面这篇文章主要给大家介绍了关于Web自动化之Selenium常用操作方法的相关资料,需要的朋友可以参考下
    2023-06-06
  • 用python实现九九乘法表实例

    用python实现九九乘法表实例

    大家好,本篇文章主要讲的是用python实现九九乘法表实例,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • python如何实现二叉搜索树算法

    python如何实现二叉搜索树算法

    二叉搜索树(BST)是一种数据结构,用于动态集合操作如搜索、插入、删除等,每个节点的左子树包含小于节点值的所有项,右子树包含大于节点值的所有项,通过中序遍历可得升序序列,插入、搜索和删除都从根节点开始,根据值的大小移动到左或右子树
    2024-10-10
  • Python使用Apache Kafka时Poll拉取速度慢的解决方法

    Python使用Apache Kafka时Poll拉取速度慢的解决方法

    在使用Apache Kafka时,poll方法拉取消息速度慢常见于网络延迟、消息大小过大、消费者配置不当或高负载情况,本文提供了优化消费者配置、并行消费、优化消息处理逻辑和监控调试的解决方案,并附有Python代码示例和相关类图、序列图以帮助理解和实现
    2024-09-09
  • Diango + uwsgi + nginx项目部署的全过程(可外网访问)

    Diango + uwsgi + nginx项目部署的全过程(可外网访问)

    这篇文章主要给大家介绍了关于Diango + uwsgi + nginx项目部署的全过程(可外网访问),文中通过示例代码将部署的过程介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-04-04
  • 用Python将结果保存为xlsx的方法

    用Python将结果保存为xlsx的方法

    今天小编就为大家分享一篇用Python将结果保存为xlsx的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01

最新评论