老生常谈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实现按当前日期(年、月、日)创建多级目录的方法
Apr 26 Python
使用Python计算玩彩票赢钱概率
Jun 26 Python
Python 数据可视化pyecharts的使用详解
Jun 26 Python
python多线程高级锁condition简单用法示例
Nov 07 Python
Python操作redis和mongoDB的方法
Dec 19 Python
Python嵌套函数,作用域与偏函数用法实例分析
Dec 26 Python
Keras 数据增强ImageDataGenerator多输入多输出实例
Jul 03 Python
Django serializer优化类视图的实现示例
Jul 16 Python
MATLAB 如何求取离散点的曲率最大值
Apr 16 Python
详解Python requests模块
Jun 21 Python
python脚本框架webpy模板控制结构
Nov 20 Python
python绘制简单直方图(质量分布图)的方法
Apr 21 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
2006/10/09 PHP
php feof用来识别文件末尾字符的方法
2010/08/01 PHP
第4章 数据处理-php数组的处理-郑阿奇
2011/07/04 PHP
nginx+php-fpm配置文件的组织结构介绍
2012/11/07 PHP
php中$_GET与$_POST过滤sql注入的方法
2014/11/03 PHP
thinkPHP实现瀑布流的方法
2014/11/29 PHP
PHP往XML中添加节点的方法
2015/03/12 PHP
PHP模板引擎smarty详细介绍
2015/05/26 PHP
实例讲解PHP设计模式编程中的简单工厂模式
2016/02/29 PHP
ThinkPHP自定义Redis处理SESSION的实现方法
2016/05/16 PHP
总结PHP中数值计算的注意事项
2016/08/14 PHP
thinkPHP多语言切换设置方法详解
2016/11/11 PHP
PHP编程获取图片的主色调的方法【基于Imagick扩展】
2017/08/02 PHP
php压缩文件夹最新版
2018/07/18 PHP
yii框架结合charjs实现统计30天数据的方法
2020/04/04 PHP
Opacity.js
2007/01/22 Javascript
谷歌浏览器 insertCell与appendChild的区别
2009/02/12 Javascript
javascript fullscreen全屏实现代码
2009/04/09 Javascript
基于jQuery的动态增删改查表格信息,可左键/右键提示(原创自Zjmainstay)
2012/07/31 Javascript
元素未显示设置width/height时IE中使用currentStyle获取为auto
2014/05/04 Javascript
JS实现根据当前文字选择返回被选中的文字
2014/05/21 Javascript
js实现网页图片延时加载 提升网页打开速度
2016/01/26 Javascript
JS定时检测任务任务完成后执行下一步的解决办法
2016/12/22 Javascript
AngularJS1.X学习笔记2-数据绑定详解
2017/04/01 Javascript
Vue中使用Sortable的示例代码
2018/04/07 Javascript
[10:34]DOTA2上海特级锦标赛全纪录
2016/03/25 DOTA
PHP webshell检查工具 python实现代码
2009/09/15 Python
Python SQLite3数据库日期与时间常见函数用法分析
2017/08/14 Python
TensorFlow实现创建分类器
2018/02/06 Python
Python程序运行原理图文解析
2018/02/10 Python
Flask框架路由和视图用法实例分析
2019/11/07 Python
Python django搭建layui提交表单,表格,图标的实例
2019/11/18 Python
IE矩阵Matrix滤镜旋转与缩放及如何结合transform
2012/11/29 HTML / CSS
电脑专业个人求职信范文
2014/02/04 职场文书
离婚协议书范文2015
2015/01/26 职场文书
Java设计模式中的命令模式
2022/04/28 Java/Android