老生常谈python函数参数的区别(必看篇)


Posted in Python onMay 29, 2017

在运用python的过程中,发现当函数参数为list的时候,在函数内部调用list.append()会改变形参,与C/C++的不太一样,查阅相关资料,在这里记录一下。

python中id可以获取对象的内存地址

>>> num1 = 10
>>> num2 = num1
>>> num3 = 10
>>> id(num1)
>>> id(num2)
>>> id(num3)

可以看到num1、num2、num3三个对象指向的是一个地址,python在这里采用的是一种叫做引用计数的方式来完成的,很类似C++zhong的智能指针,变量赋值给变量相当于同一对象引用计数器+1,而不是重新分配空间。

对于list对象可以看到下面的结果:

>>> list1 = [0,1]
>>> list2 = [0,1]
>>> id(list1)
>>> id(list2)
>>> list3 = list1
>>>id(list3)

list1与list3指向同一空间,list2指向另外的一处地址。

python中的函数传参是对象传递,同时也存在局部与全局的问题,在传参过程中存在两个规则:

通过引用将参数复制到局部作用域的对象中,意味着被用来访问函数参数的变量于提高给函数的对象无关,因为存在一个复制问题,这和C语言是相同的。而且修改局部对象不会改变原始数据。

可以在适当位置修改可变对象。可变对象主要就是列表和字典,这个适当位置实质上就是前面分析的局部子对象的修改不会改变字典对象或者列表对象的ID

def incrInt(num):
  pId(num)
  num += 1;
  pId(num)

def incrList(listArg):
  pId(listArg)
  listArg.append(1);
  pId(listArg)
def pId(arg):
  print id(arg)
num1 = 10
pId(num1)
incrInt(num1)
print(num1)

list1 = [0,2]
pId(list1)
incrList(list1)
print(list1)

结果如下:

python test.py
4299181904
10
4336979912
[0, 2, 1]

可以看到在函数内部,改变int的数值,则num指向了另一块内存地址,而修改list,则是在同一块内存地址。

在python中,对象可分为可变(mutable)和不可变(immutable)两种类型,元组(tuple)、数值型(number)、字符串(string)均为不可变对象,而字典型(dictionary)和列表(list)的对象是可变对象。

所以在传参过程中要注意下。

以上这篇老生常谈python函数参数的区别(必看篇)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
详解Python3.1版本带来的核心变化
Apr 07 Python
简单理解Python中基于生成器的状态机
Apr 13 Python
python简单的函数定义和用法实例
May 07 Python
使用Python操作MySQL的一些基本方法
Aug 16 Python
对dataframe进行列相加,行相加的实例
Jun 08 Python
win7 x64系统中安装Scrapy的方法
Nov 18 Python
详解用python生成随机数的几种方法
Aug 04 Python
Django框架模板用法入门教程
Nov 04 Python
10个Python面试常问的问题(小结)
Nov 20 Python
TensorFlow实现保存训练模型为pd文件并恢复
Feb 06 Python
Python json转字典字符方法实例解析
Apr 13 Python
TensorFlow-gpu和opencv安装详细教程
Jun 30 Python
Python进阶_关于命名空间与作用域(详解)
May 29 #Python
浅谈对yield的初步理解
May 29 #Python
python多进程和多线程究竟谁更快(详解)
May 29 #Python
python 3利用BeautifulSoup抓取div标签的方法示例
May 28 #Python
Python虚拟环境virtualenv的安装与使用详解
May 28 #Python
python 调用win32pai 操作cmd的方法
May 28 #Python
Python 稀疏矩阵-sparse 存储和转换
May 27 #Python
You might like
基于python发送邮件的乱码问题的解决办法
2013/04/25 PHP
Symfony查询方法实例小结
2017/06/28 PHP
JS模拟键盘打字效果的方法
2015/08/05 Javascript
每天一篇javascript学习小结(Array数组)
2015/11/11 Javascript
图解js图片轮播效果
2015/12/20 Javascript
jQuery取消特定的click事件
2016/02/29 Javascript
浅谈JavaScript对象的创建方式
2016/06/13 Javascript
jQuery实现的自适应焦点图效果完整实例
2016/08/24 Javascript
JS 事件绑定、事件监听、事件委托详细介绍
2016/09/28 Javascript
BootStrapTable 单选及取值的实现方法
2017/01/10 Javascript
基于JavaScript实现的顺序查找算法示例
2017/04/14 Javascript
js学习总结_基于数据类型检测的四种方式(必看)
2017/07/04 Javascript
javascript判断一个变量是数组还是对象
2019/04/10 Javascript
js实现中文实时时钟
2020/01/15 Javascript
vue组件库的在线主题编辑器的实现思路
2020/04/03 Javascript
[52:44]VGJ.T vs infamous Supermajor小组赛D组败者组第一轮 BO3 第一场 6.3
2018/06/04 DOTA
Python删除windows垃圾文件的方法
2015/07/14 Python
Python 两个列表的差集、并集和交集实现代码
2016/09/21 Python
python 网络编程详解及简单实例
2017/04/25 Python
详解Python中的分组函数groupby和itertools)
2018/07/11 Python
利用python读取YUV文件 转RGB 8bit/10bit通用
2019/12/09 Python
python手机号前7位归属地爬虫代码实例
2020/03/31 Python
Python 删除List元素的三种方法remove、pop、del
2020/11/16 Python
ALLSAINTS英国官网:伦敦新锐潮流品牌
2016/09/19 全球购物
英国领先的男装设计师服装购物网站:Mainline Menswear
2018/02/04 全球购物
澳大利亚游乐场设备品牌:Lifespan Kids
2019/05/24 全球购物
口腔工艺技术专业毕业生自荐信
2013/09/27 职场文书
影视艺术学院毕业生自荐信
2013/11/13 职场文书
党员自我评价分享
2013/12/13 职场文书
小学信息技术教学反思
2014/02/10 职场文书
人大代表选举标语
2014/10/07 职场文书
物业保洁员岗位职责
2015/02/13 职场文书
2015年工商所工作总结
2015/05/21 职场文书
用Python将库打包发布到pypi
2021/04/13 Python
Python3.8官网文档之类的基础语法阅读
2021/09/04 Python
使用Nginx搭载rtmp直播服务器的方法
2021/10/16 Servers