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中的引用和拷贝浅析
Nov 22 Python
python cx_Oracle模块的安装和使用详细介绍
Feb 13 Python
python连接数据库的方法
Oct 19 Python
tensorflow建立一个简单的神经网络的方法
Feb 10 Python
Python文本统计功能之西游记用字统计操作示例
May 07 Python
Python wxPython库消息对话框MessageDialog用法示例
Sep 03 Python
python3转换code128条形码的方法
Apr 17 Python
python中pip的使用和修改下载源的方法
Jul 08 Python
pytorch 实现删除tensor中的指定行列
Jan 13 Python
解决jupyter notebook import error但是命令提示符import正常的问题
Apr 15 Python
Django Channel实时推送与聊天的示例代码
Apr 30 Python
Windows下PyCharm配置Anaconda环境(超详细教程)
Jul 31 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
桌面中心(四)数据显示
2006/10/09 PHP
php 分页原理详解
2009/08/21 PHP
php变量范围介绍
2012/10/15 PHP
PHP执行linux命令常用函数汇总
2016/02/02 PHP
PHP+sqlite数据库操作示例(创建/打开/插入/检索)
2016/05/26 PHP
php基于单例模式封装mysql类完整实例
2016/10/18 PHP
SUN的《AJAX与J2EE》全文译了
2007/02/23 Javascript
textContent在Firefox下与innerText等效的属性
2007/05/12 Javascript
jQuery 获取对象 基本选择与层级
2010/05/31 Javascript
深入理解JavaScript系列(10) JavaScript核心(晋级高手必读篇)
2012/01/15 Javascript
javascript学习小结之prototype
2015/12/03 Javascript
jQuery插件Validate实现自定义表单验证
2016/01/18 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)
2016/02/16 Javascript
浅谈Javascript数据属性与访问器属性
2016/07/26 Javascript
Javascript使用function创建类的两种方法(推荐)
2016/11/19 Javascript
jQuery中DOM节点删除之empty与remove
2017/01/20 Javascript
js实现移动端编辑添加地址【模仿京东】
2017/04/28 Javascript
基于Koa2写个脚手架模拟接口服务的方法
2018/11/27 Javascript
通过cordova将vue项目打包为webapp的方法
2019/02/02 Javascript
vue使用svg文件补充-svg放大缩小操作(使用d3.js)
2020/09/22 Javascript
js删除指定位置超链接中含有百度与360的标题
2021/01/06 Javascript
python抓取网页图片示例(python爬虫)
2014/04/27 Python
在ironpython中利用装饰器执行SQL操作的例子
2015/05/02 Python
django 发送邮件和缓存的实现代码
2018/07/18 Python
python用pandas数据加载、存储与文件格式的实例
2018/12/07 Python
Python流程控制 if else实现解析
2019/09/02 Python
Python3 实现爬取网站下所有URL方式
2020/01/16 Python
详解python 支持向量机(SVM)算法
2020/09/18 Python
GWT都有什么特性
2016/12/02 面试题
高中毕业生自我鉴定
2013/11/03 职场文书
售后服务承诺书范文
2014/03/26 职场文书
环境工程专业自荐信范文
2014/06/24 职场文书
交心谈心活动总结
2015/05/11 职场文书
中学教师教学工作总结
2015/08/13 职场文书
《将心比心》教学反思
2016/02/23 职场文书
JS ES6异步解决方案
2021/04/29 Javascript