老生常谈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 相关文章推荐
详解Django缓存处理中Vary头部的使用
Jul 24 Python
总结网络IO模型与select模型的Python实例讲解
Jun 27 Python
Python简单获取自身外网IP的方法
Sep 18 Python
python http基本验证方法
Dec 26 Python
pandas dataframe的合并实现(append, merge, concat)
Jun 24 Python
如何利用Pyecharts可视化微信好友
Jul 04 Python
pytorch打印网络结构的实例
Aug 19 Python
如何使用Python脚本实现文件拷贝
Nov 20 Python
python匿名函数lambda原理及实例解析
Feb 07 Python
windows python3安装Jupyter Notebooks教程
Apr 13 Python
Python Excel vlookup函数实现过程解析
Jun 22 Python
pytorch交叉熵损失函数的weight参数的使用
May 24 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用户注册页面利用js进行表单验证具体实例
2013/10/17 PHP
10条php编程小技巧
2015/07/07 PHP
PHP的Yii框架的基本使用示例
2015/08/21 PHP
JavaScript的单例模式 (singleton in Javascript)
2010/06/11 Javascript
javascript实现tabs选项卡切换效果(自写原生js)
2013/03/19 Javascript
jQuery ajax dataType值为text json探索分享
2013/09/23 Javascript
jQuery实现div浮动层跟随页面滚动效果
2014/02/11 Javascript
Javascript 构造函数详解
2014/10/22 Javascript
JavaScript中Textarea滚动条不能拖动的解决方法
2015/12/15 Javascript
js输出数据精确到小数点后n位代码
2016/07/02 Javascript
mpvue 如何使用腾讯视频插件的方法
2018/07/16 Javascript
jQuery扩展方法实现Form表单与Json互相转换的实例代码
2018/09/05 jQuery
JS中getElementsByClassName与classList兼容性问题解决方案分析
2019/08/07 Javascript
openLayer4实现动态改变标注图标
2020/08/17 Javascript
mapboxgl实现带箭头轨迹线的代码
2021/01/04 Javascript
使用python实现拉钩网上的FizzBuzzWhizz问题示例
2014/05/05 Python
Python实现类继承实例
2014/07/04 Python
python django使用haystack:全文检索的框架(实例讲解)
2017/09/27 Python
Python使用django框架实现多人在线匿名聊天的小程序
2017/11/29 Python
Python实用技巧之列表、字典、集合中根据条件筛选数据详解
2018/07/11 Python
python-opencv颜色提取分割方法
2018/12/08 Python
python 读写excel文件操作示例【附源码下载】
2019/06/19 Python
Python使用pyautocad+openpyxl处理cad文件示例
2019/07/11 Python
MyFrenchPharma中文网:最大的法国药妆平台
2016/10/07 全球购物
美国家居装饰店:Z Gallerie
2020/12/28 全球购物
接口中的方法可以是abstract的吗
2015/07/23 面试题
理工大学毕业生自荐信范文
2014/02/22 职场文书
太太口服液广告词
2014/03/20 职场文书
高中学生评语大全
2014/04/25 职场文书
大学生社会实践方案
2014/05/11 职场文书
银行求职自荐书
2014/06/25 职场文书
学生上课迟到检讨书
2015/01/01 职场文书
意向协议书
2015/01/27 职场文书
二审代理词范文
2015/05/25 职场文书
省级三好学生主要事迹材料
2015/11/03 职场文书
800字作文之大雪
2019/12/04 职场文书