Python 中的参数传递、返回值、浅拷贝、深拷贝


Posted in Python onJune 25, 2019

1. Python 的参数传递

Python的参数传递,无法控制引用传递还是值传递。对于不可变对象(数字、字符、元组等)的参数,更类似值传递;对于可变对象(列表、字典等),更类似引用传递。

def fun1(n):
  print(n)  # n在没修改前,指向的地址和main函数中n指向的地址相同
  n = 20   # n在修改后,指向的地址发生改变,相当于新建了一个值为20的参数n
def fun2(l):
  print(l)  # l在没修改前,指向的地址和main函数中l指向的地址相同
  l = [5,6,7,8,9] # l在修改后,指向的地址和main函数中l指向的地址仍相同,此时main函数中l的值也会改变
if __name__=="__main__":
  n = 10
  l = [1,2,3,4,5]
  fun1(n)
  fun2(l)
  print(n)  # n的值还是10
  print(l)  # l的值在fun2()中已经被改变

2. Python 的返回值

Python的返回值,无法控制引用传递还是值传递。对于不可变对象(数字、字符、元组等)的参数,更类似值传递;对于可变对象(列表、字典等),更类似引用传递。

str1 = 'hi'
l1 = [1,2,3,4,5]
def fun1():
  return str1
def fun2():
  return l1
str2 = fun1() # 此时,str1 和 str2 的指向地址是相同的
str2 = 'hello' # 修改后,str2 指向的地址发生改变,相当于新建了一个值为`hello`的变量
l2 = fun2() # 此时,l1 和 l2 的指向地址是相同的
l2 = [6,7,8,9] # 修改后,l2 指向的地址仍相同,修改 l2 会影响到 l1

3. Python 的浅拷贝和深拷贝

对于不可变对象(数字、字符、元组等),直接赋值的结果和深拷贝一致;对于可变对象(列表、字典等),直接赋值、浅拷贝、深拷贝结果不同。

# 不可变对象(数字、字符、元组等)的例子
a = 100 
b = a
b = 30
print('a: ', a)
print('b: ', b)
# 结果:
# a = 100
# b = 30
# 可变对象(列表、字典等)的例子
import copy
dict1 = {1:1, 'user':'test', 'num':[1, 2, 3]}
dict2 = dict1 # 直接赋值,两个字典指向地址一致
dict3 = dict1.copy() # 浅拷贝,只拷贝到原对象
dict4 = copy.deepcopy(dict1) # 深拷贝,除了拷贝原对象,也会拷贝子对象
dict1[1] = 11
dict1['user'] = '123'
dict1['num'].remove(1)
print('原字典修改后:',dict1)
print('直接赋值:',dict2)
print('浅拷贝:',dict3)
print('深拷贝:',dict4)
# 结果
# 原字典修改后:{1:11,'user': '123', 'num': [2, 3]}
# 直接赋值:{1:11,'user': '123', 'num': [2, 3]}
# 浅拷贝:{1:1,'user': 'test', 'num': [2, 3]}
# 深拷贝:{1:1,'user': 'test', 'num': [1, 2, 3]}

总结

以上所述是小编给大家介绍的Python 中的参数传递、返回值、浅拷贝、深拷贝,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python实现去除下载电影和电视剧文件名中的多余字符的方法
Sep 23 Python
Python内存管理方式和垃圾回收算法解析
Nov 11 Python
Python通过OpenCV的findContours获取轮廓并切割实例
Jan 05 Python
Python Grid使用和布局详解
Jun 30 Python
python实现flappy bird小游戏
Dec 24 Python
用python做游戏的细节详解
Jun 25 Python
Tensorflow实现多GPU并行方式
Feb 03 Python
python自定义函数def的应用详解
Jun 03 Python
Python中的None与 NULL(即空字符)的区别详解
Sep 24 Python
matplotlib相关系统目录获取方式小结
Feb 03 Python
Python深度学习之Pytorch初步使用
May 20 Python
python周期任务调度工具Schedule使用详解
Nov 23 Python
pyqt5 删除layout中的所有widget方法
Jun 25 #Python
在Python中表示一个对象的方法
Jun 25 #Python
Python设置matplotlib.plot的坐标轴刻度间隔以及刻度范围
Jun 25 #Python
浅谈PyQt5 的帮助文档查找方法,可以查看每个类的方法
Jun 25 #Python
PyQt5根据控件Id获取控件对象的方法
Jun 25 #Python
PyQt5组件读取参数的实例
Jun 25 #Python
华为2019校招笔试题之处理字符串(python版)
Jun 25 #Python
You might like
不用数据库的多用户文件自由上传投票系统(1)
2006/10/09 PHP
用PHP即时捕捉PHP中的错误并发送email通知的实现代码
2013/01/19 PHP
Laravel 5.3 学习笔记之 错误&日志
2016/08/28 PHP
解决出现SoapFault (looks like we got no XML document)的问题
2017/06/24 PHP
学习YUI.Ext 第二天
2007/03/10 Javascript
学习YUI.Ext 第六天--关于树TreePanel(Part 2异步获取节点)
2007/03/10 Javascript
jQuery源码分析-01总体架构分析
2011/11/14 Javascript
倒记时60刷新网页的js代码
2014/02/18 Javascript
jQuery中:selected选择器用法实例
2015/01/04 Javascript
Vuex中mutations与actions的区别详解
2018/03/01 Javascript
在vue-cli搭建的项目中增加后台mock接口的方法
2018/04/26 Javascript
element-ui 关于获取select 的label值方法
2018/08/24 Javascript
javascript中的event loop事件循环详解
2018/12/14 Javascript
JQuery事件委托原理与用法实例分析
2019/05/13 jQuery
送你43道JS面试题(收藏)
2019/06/17 Javascript
[01:42]TI4西雅图DOTA2前线报道 第一顿早饭哦
2014/07/08 DOTA
解决Django模板无法使用perms变量问题的方法
2017/09/10 Python
python利用requests库进行接口测试的方法详解
2018/07/06 Python
python实现二维插值的三维显示
2018/12/17 Python
python实现简单井字棋小游戏
2020/03/05 Python
jupyter notebook 恢复误删单元格或者历史代码的实现
2020/04/17 Python
Python插件机制实现详解
2020/05/04 Python
解决python中import文件夹下面py文件报错问题
2020/06/01 Python
opencv-python的RGB与BGR互转方式
2020/06/02 Python
Pycharm学生免费专业版安装教程的方法步骤
2020/09/24 Python
CSS3 对过渡(transition)进行调速以及延时
2020/10/21 HTML / CSS
北京捷通华声语音技术有限公司Java软件工程师笔试题
2012/04/10 面试题
实习求职信
2013/12/01 职场文书
女儿十岁生日答谢词
2014/01/27 职场文书
教师党员岗位承诺书
2014/05/29 职场文书
商务英语专业大学生职业生涯规划书
2014/09/14 职场文书
大学生赌博检讨书
2014/09/22 职场文书
湖南省召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
研究生个人学年总结
2015/02/14 职场文书
美容院管理规章制度
2015/08/05 职场文书
Python中request的基本使用解决乱码问题
2022/04/12 Python