老生常谈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 相关文章推荐
10个易被忽视但应掌握的Python基本用法
Apr 01 Python
用Python解析XML的几种常见方法的介绍
Apr 09 Python
python中split方法用法分析
Apr 17 Python
python使用wxpython开发简单记事本的方法
May 20 Python
Python3字符串学习教程
Aug 20 Python
Python多线程经典问题之乘客做公交车算法实例
Mar 22 Python
python处理xml文件的方法小结
May 02 Python
python文件操作的简单方法总结
Nov 07 Python
详解Python可视化神器Yellowbrick使用
Nov 11 Python
在Ubuntu 20.04中安装Pycharm 2020.1的图文教程
Apr 30 Python
Python如何读取、写入CSV数据
Jul 28 Python
详解pycharm自动import所需的库的操作方法
Nov 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
php 取得瑞年与平年的天数的代码
2009/08/10 PHP
PHP5.5迭代生成器用法实例详解
2016/03/16 PHP
JavaScript 调试器简介
2009/02/21 Javascript
jQuery的.live()和.die() 使用介绍
2011/09/10 Javascript
JS修改css样式style浅谈
2013/05/06 Javascript
jquery 漂亮的删除确认和提交无刷新删除示例
2013/11/13 Javascript
jQuery获得包含margin的outerWidth和outerHeight的方法
2015/03/25 Javascript
Jquery插件仿百度搜索关键字自动匹配功能
2016/05/11 Javascript
jquery获取点击控件的绝对位置简单实例
2016/10/13 Javascript
JS简单判断函数是否存在的方法
2017/02/13 Javascript
详解Vue.js搭建路由报错 router.map is not a function
2017/06/27 Javascript
vue+springboot前后端分离实现单点登录跨域问题解决方法
2018/01/30 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(下)
2018/04/18 Javascript
JS+HTML5 Canvas实现简单的写字板功能示例
2018/08/30 Javascript
使用nvm和nrm优化node.js工作流的方法
2019/01/17 Javascript
Vue动态创建注册component的实例代码
2019/06/14 Javascript
三步搞定:Vue.js调用Android原生操作
2020/09/07 Javascript
python 从远程服务器下载日志文件的程序
2013/02/10 Python
使用Python操作MySQL的一些基本方法
2015/08/16 Python
Python+django实现文件上传
2016/01/17 Python
不归路系列:Python入门之旅-一定要注意缩进!!!(推荐)
2019/04/16 Python
python实现智能语音天气预报
2019/12/02 Python
PyTorch实现ResNet50、ResNet101和ResNet152示例
2020/01/14 Python
python正则过滤字母、中文、数字及特殊字符方法详解
2020/02/11 Python
JupyterNotebook 输出窗口的显示效果调整实现
2020/09/22 Python
The North Face意大利官网:服装、背包和鞋子
2020/06/17 全球购物
如何处理简单的PHP错误
2015/10/14 面试题
常用UNIX 命令(Linux的常用命令)
2015/12/26 面试题
如何理解transaction事务的概念
2015/05/27 面试题
献爱心倡议书
2014/04/14 职场文书
经贸日语专业个人求职信范文
2014/04/29 职场文书
团支部推优材料
2014/05/21 职场文书
森马旗舰店双十一营销方案
2014/09/29 职场文书
毕业论文致谢格式模板
2015/05/14 职场文书
CSS使用伪类控制边框长度的方法
2022/01/18 HTML / CSS
《模拟人生4》推出新补丁 “婚礼奇缘”DLC终于得到修复
2022/04/03 其他游戏