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分析nignx访问日志脚本分享
Feb 26 Python
python实现通过pil模块对图片格式进行转换的方法
Mar 24 Python
pymongo给mongodb创建索引的简单实现方法
May 06 Python
python3新特性函数注释Function Annotations用法分析
Jul 28 Python
python后端接收前端回传的文件方法
Jan 02 Python
python turtle库画一个方格和圆实例
Jun 27 Python
python将字符串转换成json的方法小结
Jul 09 Python
PyQt5实现暗黑风格的计时器
Jul 29 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
Mar 13 Python
Python进程间通信multiprocess代码实例
Mar 18 Python
Python自带的IDE在哪里
Jul 01 Python
python爬虫利用代理池更换IP的方法步骤
Feb 21 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读取html并截取字符串的简单代码
2009/11/30 PHP
joomla内置的表单验证功能使用方法
2010/06/11 PHP
为PHP安装imagick时出现Cannot locate header file MagickWand.h错误的解决方法
2014/11/03 PHP
PHP使用MPDF类生成PDF的方法
2015/12/08 PHP
关于Mozilla浏览器不支持innerText的解决办法
2011/01/01 Javascript
jQuery获取Select选择的Text和Value(详细汇总)
2013/01/25 Javascript
javascript定义变量时有var和没有var的区别探讨
2014/07/21 Javascript
JavaScript 轮播图和自定义滚动条配合鼠标滚轮分享代码贴
2016/10/28 Javascript
Three.js基础部分学习
2017/01/08 Javascript
vue实现简单实时汇率计算功能
2017/01/15 Javascript
Bootstrap选项卡学习笔记分享
2017/02/13 Javascript
vue2.0 自定义日期时间过滤器
2017/06/07 Javascript
JQuery form表单提交前验证单选框是否选中、删除记录时验证经验总结(整理)
2017/06/09 jQuery
bootstrap table插件的分页与checkbox使用详解
2017/07/23 Javascript
JS实现的input选择图片本地预览功能示例
2018/08/29 Javascript
小程序实现搜索界面 小程序实现推荐搜索列表效果
2019/05/18 Javascript
JavaScript setInterval()与setTimeout()计时器
2019/12/27 Javascript
vuejs实现下拉框菜单选择
2020/10/23 Javascript
[00:30]明星选手化身超级英雄!2018DOTA2亚洲邀请赛全明星赛来临!
2018/04/06 DOTA
python使用三角迭代计算圆周率PI的方法
2015/03/20 Python
django开发post接口简单案例,获取参数值的方法
2018/12/11 Python
Python安装tar.gz格式文件方法详解
2020/01/19 Python
Python 之 Json序列化嵌套类方式
2020/02/27 Python
解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
2020/06/12 Python
python实现二分类和多分类的ROC曲线教程
2020/06/15 Python
matplotlib之属性组合包(cycler)的使用
2021/02/24 Python
一款利用纯css3实现的超炫3D表单的实例教程
2014/12/01 HTML / CSS
命名空间(namespace)和程序集(Assembly)有什么区别
2015/09/25 面试题
php优化查询foreach代码实例讲解
2021/03/24 PHP
业务员岗位职责
2013/11/16 职场文书
中学生运动会入场词
2014/02/12 职场文书
博士生专家推荐信
2014/09/26 职场文书
领导干部作风建设工作总结
2014/10/23 职场文书
感谢师恩主题班会
2015/08/17 职场文书
解决Pytorch dataloader时报错每个tensor维度不一样的问题
2021/05/28 Python
如何通过cmd 连接阿里云服务器
2022/04/18 Servers