老生常谈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 图片验证码代码
Dec 07 Python
python计算书页码的统计数字问题实例
Sep 26 Python
Python实现的当前时间多加一天、一小时、一分钟操作示例
May 21 Python
关于 Python opencv 使用中的 ValueError: too many values to unpack
Jun 28 Python
python tkinter实现彩球碰撞屏保
Jul 30 Python
如何运行带参数的python脚本
Nov 15 Python
Python编程快速上手——Excel到CSV的转换程序案例分析
Feb 28 Python
django修改models重建数据库的操作
Mar 31 Python
python实现扫雷小游戏
Apr 24 Python
使用Python实现音频双通道分离
Dec 25 Python
python如何做代码性能分析
Apr 26 Python
Python常用配置文件ini、json、yaml读写总结
Jul 09 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提取中文首字母
2008/04/09 PHP
php 缓存函数代码
2008/08/27 PHP
PHP操作文件类的函数代码(文件和文件夹创建,复制,移动和删除)
2011/11/10 PHP
关于使用coreseek并为其做分页的介绍
2013/06/21 PHP
PHP SPL使用方法和他的威力
2013/11/12 PHP
PHP实现获取域名的方法小结
2014/11/05 PHP
PDO操作MySQL的基础教程(推荐)
2017/08/18 PHP
关于使用runtimeStyle属性问题讨论文章
2007/03/08 Javascript
javascript 从if else 到 switch case 再到抽象
2010/07/17 Javascript
jQuery实现原理的模拟代码 -6 代码下载
2010/08/16 Javascript
浅谈javascript的分号的使用
2015/05/12 Javascript
如何根据百度地图计算出两地之间的驾驶距离(两种语言js和C#)
2015/10/29 Javascript
详解利用exif.js解决ios手机上传竖拍照片旋转90度问题
2016/11/04 Javascript
Vue2实现组件props双向绑定
2016/12/02 Javascript
详解使用vscode+es6写nodejs服务端调试配置
2017/09/21 NodeJs
vue实现组件之间传值功能示例
2018/07/13 Javascript
基于Vue 实现一个中规中矩loading组件
2019/04/03 Javascript
jQuery 隐藏/显示效果函数用法实例分析
2020/05/20 jQuery
解决antd的Form组件setFieldsValue的警告问题
2020/10/29 Javascript
Python类的用法实例浅析
2015/05/27 Python
python+selenium+PhantomJS抓取网页动态加载内容
2020/02/25 Python
使用CSS3实现一个3D相册效果实例
2016/12/03 HTML / CSS
巴西最好的男鞋:Rafarillo
2018/05/25 全球购物
在线课程:Skillshare
2019/04/02 全球购物
过滤器的用法
2013/10/08 面试题
如何将一个描述日期或日期/时间的字符串转换为一个Date对象
2015/10/13 面试题
智能电子应届生求职信
2013/11/10 职场文书
恶搞卫生巾广告词
2014/03/18 职场文书
2014五一国际劳动节活动总结范文
2014/04/14 职场文书
大学班级计划书
2014/04/29 职场文书
公安局负责人查摆问题及整改方案
2014/09/27 职场文书
司机岗位职责范本
2015/04/10 职场文书
科级干部培训心得体会
2016/01/06 职场文书
致创业的您:这类人不适合餐饮创业
2019/08/19 职场文书
java objectUtils 使用可能会出现的问题
2022/02/28 Java/Android
Golang并发工具Singleflight
2022/05/06 Golang