老生常谈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 相关文章推荐
linux系统使用python监控apache服务器进程脚本分享
Jan 15 Python
python中global与nonlocal比较
Nov 21 Python
python模块简介之有序字典(OrderedDict)
Dec 01 Python
python使用opencv进行人脸识别
Apr 07 Python
python3写的简单本地文件上传服务器实例
Jun 04 Python
对Python 窗体(tkinter)树状数据(Treeview)详解
Oct 11 Python
Python零基础入门学习之输入与输出
Apr 03 Python
Python实现FTP文件传输的实例
Jul 07 Python
Python图像处理库PIL的ImageGrab模块介绍详解
Feb 26 Python
python如何写出表白程序
Jun 01 Python
Python中用xlwt制作表格实例讲解
Nov 05 Python
Python爬虫进阶之爬取某视频并下载的实现
Dec 08 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访问查询mysql数据的三种方法
2006/10/09 PHP
分享常见的几种页面静态化的方法
2015/01/08 PHP
Linux系统下使用XHProf和XHGui分析PHP运行性能
2015/12/08 PHP
php str_replace替换指定次数的方法详解
2017/05/05 PHP
利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
2017/06/27 PHP
浅析PHP开发规范
2018/02/05 PHP
Thinkphp框架+Layui实现图片/文件上传功能分析
2020/02/07 PHP
从父页面读取和操作iframe中内容方法
2009/07/25 Javascript
jQuery的三种$()
2009/12/30 Javascript
jquery获得下拉框值的代码
2011/08/13 Javascript
JS实现获取键盘按下的按键并显示在页面上的方法
2015/11/04 Javascript
初识angular框架后的所思所想
2016/02/19 Javascript
使用Script元素发送JSONP请求的方法
2016/06/12 Javascript
深入理解jQuery.data() 的实现方式
2016/11/30 Javascript
jQuery除指定区域外点击任何地方隐藏DIV功能
2017/11/13 jQuery
基于Bootstrap表单验证功能
2017/11/17 Javascript
通过JQuery,JQueryUI和Jsplumb实现拖拽模块
2019/06/18 jQuery
微信小程序上传图片并等比列压缩到指定大小的实例代码
2019/10/24 Javascript
关于IDEA中的.VUE文件报错 Export declarations are not supported by current JavaScript version
2020/10/17 Javascript
python表格存取的方法
2018/03/07 Python
Django代码性能优化与Pycharm Profile使用详解
2018/08/26 Python
Python面向对象程序设计之私有属性及私有方法示例
2019/04/08 Python
使用python serial 获取所有的串口名称的实例
2019/07/02 Python
python Django框架实现web端分页呈现数据
2019/10/31 Python
python 统计文件中的字符串数目示例
2019/12/24 Python
Python正则表达式学习小例子
2020/03/03 Python
Scrapy实现模拟登录的示例代码
2021/02/21 Python
Canvas实现放大镜效果完整案例分析(附代码)
2020/11/26 HTML / CSS
香蕉共和国Banana Republic官网:美国GAP旗下偏贵族风格服饰品牌
2016/11/21 全球购物
国际旅客访问北美最大的汽车租赁提供商:Alamo Rent A Car
2018/06/13 全球购物
读书小明星事迹材料
2014/05/03 职场文书
体操比赛口号
2014/06/10 职场文书
2016机关干部作风建设心得体会
2016/01/21 职场文书
适合青年人白手起家的创业项目分享
2019/08/16 职场文书
python tkinter实现定时关机
2021/04/21 Python
如何用Laravel包含你自己的帮助函数
2021/05/27 PHP