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 time模块用法实例详解
Sep 11 Python
Python中不同进制互相转换(二进制、八进制、十进制和十六进制)
Apr 05 Python
Python在Windows和在Linux下调用动态链接库的教程
Aug 18 Python
python 第三方库的安装及pip的使用详解
May 11 Python
Django如何实现内容缓存示例详解
Sep 24 Python
简单了解python模块概念
Jan 11 Python
Python迭代器定义与简单用法分析
Apr 30 Python
Python开发虚拟环境使用virtualenvwrapper的搭建步骤教程图解
Sep 19 Python
python实现低通滤波器代码
Feb 26 Python
如何使用repr调试python程序
Feb 28 Python
Python中的wordcloud库安装问题及解决方法
May 27 Python
pymongo insert_many 批量插入的实例
Dec 05 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
php pdo oracle中文乱码的快速解决方法
2016/05/16 PHP
使用 PHP Masked Package 屏蔽敏感数据的实现方法
2019/10/15 PHP
Yii框架小部件(Widgets)用法实例详解
2020/05/15 PHP
javascript编程起步(第六课)
2007/02/27 Javascript
获取当前网页document.url location.href区别总结
2008/05/10 Javascript
使用ExtJS技术实现的拖动树结点
2010/08/05 Javascript
基于jQuery的图片大小自动适应实现代码
2010/11/17 Javascript
jquery lazyload延迟加载技术的实现原理分析
2011/01/24 Javascript
nodejs教程之入门
2014/11/21 NodeJs
浅谈javascript属性onresize
2015/04/20 Javascript
jQuery实现的鼠标经过时变宽的效果(附demo源码)
2016/04/28 Javascript
js阻止默认浏览器行为与冒泡行为的实现代码
2016/05/15 Javascript
js的各种排序算法实现(总结)
2016/07/23 Javascript
浅谈js中同名函数和同名变量的执行问题
2017/02/12 Javascript
vue3.0 CLI - 2.4 - 新组件 Forms.vue 中学习表单
2018/09/14 Javascript
浅谈vue引用静态资源需要注意的事项
2018/09/28 Javascript
python实现人人网登录示例分享
2014/01/19 Python
python根据出生日期获得年龄的方法
2015/03/31 Python
Python脚本实现自动将数据库备份到 Dropbox
2017/02/06 Python
Python实现矩阵加法和乘法的方法分析
2017/12/19 Python
python 列表删除所有指定元素的方法
2018/04/19 Python
pandas带有重复索引操作方法
2018/06/08 Python
在pycharm上mongodb配置及可视化设置方法
2018/11/30 Python
python json.loads兼容单引号数据的方法
2018/12/19 Python
对Python中 \r, \n, \r\n的彻底理解
2020/03/06 Python
Django视图、传参和forms验证操作
2020/07/15 Python
Python3+RIDE+RobotFramework自动化测试框架搭建过程详解
2020/09/23 Python
利用CSS3实现平移动画效果示例代码
2016/10/12 HTML / CSS
英国最大的海报商店:GB Posters
2018/03/20 全球购物
物业经理求职自我评价
2013/09/22 职场文书
内容编辑个人求职信
2013/12/10 职场文书
青春演讲稿范文
2014/05/08 职场文书
大学生标准自荐书
2014/06/15 职场文书
2014市国税局对照检查材料思想汇报
2014/09/23 职场文书
Python Django / Flask如何使用Elasticsearch
2022/04/19 Python
Android开发手册Chip监听及ChipGroup监听
2022/06/10 Java/Android