老生常谈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 相关文章推荐
python网页请求urllib2模块简单封装代码
Feb 07 Python
Python引用(import)文件夹下的py文件的方法
Aug 26 Python
Python下的subprocess模块的入门指引
Apr 16 Python
Python基于列表模拟堆栈和队列功能示例
Jan 05 Python
python脚本监控Tomcat服务器的方法
Jul 06 Python
python在html中插入简单的代码并加上时间戳的方法
Oct 16 Python
在python中以相同顺序shuffle两个list的方法
Dec 13 Python
python 堆和优先队列的使用详解
Mar 05 Python
Pytorch中的variable, tensor与numpy相互转化的方法
Oct 10 Python
使用pickle存储数据dump 和 load实例讲解
Dec 30 Python
Pytorch 实现计算分类器准确率(总分类及子分类)
Jan 18 Python
python中sys模块的介绍与实例
Apr 17 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
php设计模式 Strategy(策略模式)
2011/06/26 PHP
yii上传文件或图片实例
2014/04/01 PHP
注释PHP和html混合代码的小技巧(分享)
2016/11/03 PHP
070823更新的一个[消息提示框]组件 兼容ie7
2007/08/29 Javascript
超酷的网页音乐播放器DewPlayer使用方法
2010/12/18 Javascript
js Form.elements[i]的使用实例
2011/11/13 Javascript
jquery结合CSS使用validate实现漂亮的验证
2015/01/29 Javascript
JavaScript中的值是按值传递还是按引用传递问题探讨
2015/01/30 Javascript
js实现的全国省市二级联动下拉选择菜单完整实例
2015/08/17 Javascript
bootstrap datetimepicker实现秒钟选择下拉框
2017/01/05 Javascript
jQuery插件FusionWidgets实现的Bulb图效果示例【附demo源码下载】
2017/03/23 jQuery
jQuery取得元素标签名称小结(附代码)
2017/08/16 jQuery
详解webpack babel的配置
2018/01/09 Javascript
react实现同页面三级跳转路由布局
2019/09/26 Javascript
vuex实现购物车功能
2020/06/28 Javascript
js实现弹幕墙效果
2020/12/10 Javascript
[05:14]辉夜杯主赛事第二日 RECAP精彩回顾
2015/12/27 DOTA
Python使用metaclass实现Singleton模式的方法
2015/05/05 Python
Python中的choice()方法使用详解
2015/05/15 Python
json跨域调用python的方法详解
2017/01/11 Python
python实现人脸识别代码
2017/11/08 Python
python中的随机函数random的用法示例
2018/01/27 Python
python3射线法判断点是否在多边形内
2019/06/28 Python
Python中请不要再用re.compile了
2019/06/30 Python
Python之Numpy的超实用基础详细教程
2019/10/23 Python
浅谈django channels 路由误导
2020/05/28 Python
Java ExcutorService优雅关闭方式解析
2020/05/30 Python
C++面试题目
2013/06/25 面试题
大学生个人总结的自我评价
2013/10/05 职场文书
中学老师的自我评价
2013/11/07 职场文书
银行职业规划书范文
2013/12/28 职场文书
小学运动会表扬稿
2014/01/19 职场文书
快餐公司创业计划书
2014/04/29 职场文书
2014年仓库管理工作总结
2014/12/17 职场文书
教你快速开启Apache SkyWalking的自监控
2021/04/25 Servers
Python合并pdf文件的工具
2021/07/01 Python