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实现的计算器功能示例
Apr 26 Python
python3.6.3+opencv3.3.0实现动态人脸捕获
May 25 Python
python计算日期之间的放假日期
Jun 05 Python
Django开发中的日志输出的方法
Jul 02 Python
Python解决两个整数相除只得到整数部分的实例
Nov 10 Python
Python3 jupyter notebook 服务器搭建过程
Nov 30 Python
Python多进程写入同一文件的方法
Jan 14 Python
python实现大转盘抽奖效果
Jan 22 Python
PyTorch搭建一维线性回归模型(二)
May 22 Python
jupyter lab的目录调整及设置默认浏览器为chrome的方法
Apr 10 Python
Python 字符串池化的前提
Jul 03 Python
Django程序的优化技巧
Apr 29 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的加密方式及原理
2012/06/14 PHP
php实现可逆加密的方法
2015/08/11 PHP
Laravel如何自定义command命令浅析
2019/03/23 PHP
php 函数中静态变量使用的问题实例分析
2020/03/05 PHP
屏蔽Flash右键信息的js代码
2010/01/17 Javascript
Javascript创建自定义对象 创建Object实例添加属性和方法
2012/06/04 Javascript
关于innerHTML后丢失动态绑定的EVENT问题解决方法
2013/05/19 Javascript
JQuery动画与特效实例分析
2015/02/02 Javascript
Javascript中With语句用法实例
2015/05/14 Javascript
js实现字符串和数组之间相互转换操作
2016/01/12 Javascript
js实现适合新闻类图片的轮播效果
2017/02/05 Javascript
angular directive的简单使用总结
2017/05/24 Javascript
JavaScript实现移动端轮播效果
2017/06/06 Javascript
详解探索 vuex 2.0 以及使用 vuejs 2.0 + vuex 2.0 构建记事本应用
2017/06/16 Javascript
深入理解vue中slot与slot-scope的具体使用
2018/01/26 Javascript
jQuery替换节点元素的操作方法
2018/03/18 jQuery
Vue 组件传值几种常用方法【总结】
2018/05/28 Javascript
vue.js实现h5机器人聊天(测试版)
2020/07/16 Javascript
[00:33]2018DOTA2亚洲邀请赛TNC出场
2018/04/04 DOTA
python基础教程之对象和类的实际运用
2014/08/29 Python
Python基础教程之利用期物处理并发
2018/03/29 Python
python 时间信息“2018-02-04 18:23:35“ 解析成字典形式的结果代码详解
2018/04/19 Python
python 实现简单的FTP程序
2019/12/27 Python
Pytorch Tensor 输出为txt和mat格式方式
2020/01/03 Python
matplotlib之pyplot模块坐标轴标签设置使用(xlabel()、ylabel())
2021/02/22 Python
HTML5+CSS3实现无插件拖拽上传图片(支持预览与批量)
2017/01/05 HTML / CSS
关于HTML5的22个初级技巧(图文教程)
2012/06/21 HTML / CSS
美赞臣营养马来西亚旗舰店:Enfagrow马来西亚
2019/07/26 全球购物
都柏林通行卡/城市通票:The Dublin Pass
2020/02/16 全球购物
自动化专业职业生涯规划书范文
2014/01/16 职场文书
反腐倡廉警示教育活动总结
2014/05/05 职场文书
2014各大专业毕业生自我评价
2014/09/17 职场文书
2014年药店工作总结
2014/11/20 职场文书
2015年党支部公开承诺书
2015/01/22 职场文书
聊聊pytorch测试的时候为何要加上model.eval()
2021/05/23 Python
python引入其他文件夹下的py文件具体方法
2021/05/23 Python