老生常谈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聊天室实例程序分享
Jan 05 Python
Python 实现简单的shell sed替换功能(实例讲解)
Sep 29 Python
Python嵌套式数据结构实例浅析
Mar 05 Python
Python动态赋值的陷阱知识点总结
Mar 17 Python
Django 查询数据库并返回页面的例子
Aug 12 Python
简单了解pytest测试框架setup和tearDown
Apr 14 Python
Python json格式化打印实现过程解析
Jul 21 Python
Python如何使用ConfigParser读取配置文件
Nov 12 Python
Django数据统计功能count()的使用
Nov 30 Python
浅析Python模块之间的相互引用问题
Feb 26 Python
4种非常实用的python内置数据结构
Apr 28 Python
详解Python常用的魔法方法
Jun 03 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操作MongoDB时的整数问题及对策说明
2011/05/02 PHP
php中计算中文字符串长度、截取中文字符串的函数代码
2011/08/09 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
js实现多图左右切换功能
2016/08/04 Javascript
手把手教你把nodejs部署到linux上跑出hello world
2017/06/19 NodeJs
浅谈实现vue2.0响应式的基本思路
2018/02/13 Javascript
Vue.js中对css的操作(修改)具体方式详解
2018/10/30 Javascript
如何提升vue.js中大型数据的性能
2019/06/21 Javascript
layui文件上传控件带更改后数据传值的方法
2019/09/23 Javascript
Vue快速实现通用表单验证的示例代码
2020/01/09 Javascript
创建nuxt.js项目流程图解
2020/03/13 Javascript
vue使用transition组件动画效果的实例代码
2021/01/28 Vue.js
[51:15]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-GAMING
2014/05/22 DOTA
Python守护进程(daemon)代码实例
2015/03/06 Python
Python中使用items()方法返回字典元素对的教程
2015/05/21 Python
Python实现批量检测HTTP服务的状态
2016/10/27 Python
浅谈Python数据类型判断及列表脚本操作
2016/11/04 Python
Python中的id()函数指的什么
2017/10/17 Python
Python元字符的用法实例解析
2018/01/17 Python
解决python ogr shp字段写入中文乱码的问题
2018/12/31 Python
python使用selenium实现批量文件下载
2019/03/11 Python
计算机二级python学习教程(1) 教大家如何学习python
2019/05/16 Python
python实现邮件循环自动发件功能
2020/09/11 Python
python安装mysql的依赖包mysql-python操作
2021/01/01 Python
LocalStorage记住用户和密码功能
2017/07/24 HTML / CSS
John Varvatos官方网站:设计师男士时装
2017/02/08 全球购物
Baracuta官方网站:Harrington夹克,G9,G4,G10等
2018/03/06 全球购物
美国最好的钓鱼、狩猎和划船装备商店:Bass Pro Shops
2018/12/02 全球购物
会计职业生涯规划范文
2014/01/04 职场文书
会计电算化毕业生自荐信
2014/03/03 职场文书
2014年发展党员工作总结
2014/11/12 职场文书
优秀共青团员事迹材料
2014/12/25 职场文书
Java反应式框架Reactor中的Mono和Flux
2021/07/25 Java/Android
css3中transform属性实现的4种功能
2021/08/07 HTML / CSS
Python可变集合和不可变集合的构造方法大全
2021/12/06 Python
python flappy bird小游戏分步实现流程
2022/02/15 Python