老生常谈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 相关文章推荐
详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
Apr 18 Python
Matplotlib 生成不同大小的subplots实例
May 25 Python
Python3.5内置模块之time与datetime模块用法实例分析
Apr 27 Python
python IDLE 背景以及字体大小的修改方法
Jul 12 Python
python logging日志模块原理及操作解析
Oct 12 Python
python 伯努利分布详解
Feb 25 Python
在Matplotlib图中插入LaTex公式实例
Apr 17 Python
python 如何实现遗传算法
Sep 22 Python
python中yield的用法详解
Jan 13 Python
解决Python中的modf()函数取小数部分不准确问题
May 28 Python
深入浅析python3 依赖倒置原则(示例代码)
Jul 09 Python
Python批量解压&压缩文件夹的示例代码
Apr 04 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
本地机apache配置基于域名的虚拟主机详解
2013/08/10 PHP
php类声明和php类使用方法示例分享
2014/03/29 PHP
PHP通过反射动态加载第三方类和获得类源码的实例
2015/11/27 PHP
javascript YUI 读码日记之 YAHOO.util.Dom - Part.4
2008/03/22 Javascript
学习javascript,实现插入排序实现代码
2011/07/31 Javascript
jquery Tab效果和动态加载的简单实例
2013/12/11 Javascript
jQuery 中$(this).index与$.each的使用指南
2014/11/20 Javascript
node.js中的events.emitter.listeners方法使用说明
2014/12/10 Javascript
nodejs通过phantomjs实现下载网页
2015/05/04 NodeJs
JavaScript动态创建form表单并提交的实现方法
2015/12/10 Javascript
jquery遍历标签中自定义的属性方法
2016/09/17 Javascript
用v-html解决Vue.js渲染中html标签不被解析的问题
2016/12/14 Javascript
Angular.js基础学习之初始化
2017/03/10 Javascript
AngularJS双向数据绑定原理之$watch、$apply和$digest的应用
2018/01/30 Javascript
小程序实现页面顶部选项卡效果
2018/11/06 Javascript
js实现倒计时器自定义时间和暂停
2019/02/25 Javascript
java遇到微信小程序 "支付验证签名失败" 问题解决
2019/12/22 Javascript
分享8个JavaScript库可更好地处理本地存储
2020/10/12 Javascript
python求斐波那契数列示例分享
2014/02/14 Python
Python 多线程抓取图片效率对比
2016/02/27 Python
浅谈Python 的枚举 Enum
2017/06/12 Python
Python实现matplotlib显示中文的方法详解
2018/02/06 Python
pandas.dataframe按行索引表达式选取方法
2018/10/30 Python
python操作docx写入内容,并控制文本的字体颜色
2020/02/13 Python
在脚本中单独使用django的ORM模型详解
2020/04/01 Python
基于 Python 实践感知器分类算法
2021/01/07 Python
Viking Direct爱尔兰:办公用品和家具
2019/11/21 全球购物
台湾全方位线上课程与职能学习平台:TibaMe
2019/12/04 全球购物
美国农场商店:Blain’s Farm & Fleet
2020/01/17 全球购物
大四学年自我鉴定
2013/11/13 职场文书
新年团拜会主持词
2014/04/02 职场文书
小学感恩主题班会
2015/08/12 职场文书
从np.random.normal()到正态分布的拟合操作
2021/06/02 Python
Python识别花卉种类鉴定网络热门植物并自动整理分类
2022/04/08 Python
sql查询语句之平均分、最高最低分及排序语句
2022/05/30 MySQL
V Rising 服务器搭建图文教程
2022/06/16 Servers