老生常谈python函数参数的区别(必看篇)

 更新时间:2017年05月29日 09:02:34   投稿:jingxian  
下面小编就为大家带来一篇老生常谈python函数参数的区别(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

在运用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函数参数的区别(必看篇)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python3生成手写体数字方法

    Python3生成手写体数字方法

    本篇文章给大家分享习如何Python3生成手写体数字方法以及实例代码分享,有兴趣的朋友参考下吧。
    2018-01-01
  • pytorch1.0中torch.nn.Conv2d用法详解

    pytorch1.0中torch.nn.Conv2d用法详解

    今天小编就为大家分享一篇pytorch1.0中torch.nn.Conv2d用法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • 用python找出那些被“标记”的照片

    用python找出那些被“标记”的照片

    这篇文章主要介绍了用python找出那些被“标记”的照片的相关资料,需要的朋友可以参考下
    2017-04-04
  • Pycharm编辑器技巧之自动导入模块详解

    Pycharm编辑器技巧之自动导入模块详解

    我们在编程过程中经常会不经意的使用到一些尚未导入的类和模块,在这种情况下Pycharm会帮助我们定位模块文件位置并将其添加到导入列表中,这也就是所谓的自动导入模块功能。本文给大家介绍了关于Pycharm编辑器技巧之自动导入模块的相关资料,需要的朋友可以参考下。
    2017-07-07
  • python飞机大战pygame游戏之敌机出场实现方法详解

    python飞机大战pygame游戏之敌机出场实现方法详解

    这篇文章主要介绍了python飞机大战pygame游戏之敌机出场实现方法,结合实例形式详细分析了Python使用pygame模块实现飞机大战游戏中敌机出场相关实现技巧,需要的朋友可以参考下
    2019-12-12
  • Pycharm学习教程(4) Python解释器的相关配置

    Pycharm学习教程(4) Python解释器的相关配置

    这篇文章主要为大家详细介绍了最全的Pycharm学习教程第四篇,Python解释器配置,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • Python文件基本操作open函数应用与示例详解

    Python文件基本操作open函数应用与示例详解

    这篇文章主要为大家介绍了Python文件基本操作open函数应用与示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • python安装包出现Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None))问题解决

    python安装包出现Retrying (Retry(total=4, connect=None, read=No

    这篇文章主要给大家介绍了关于python安装包出现Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None))问题的解决方法,需要的朋友可以参考下
    2022-09-09
  • 在pycharm 中添加运行参数的操作方法

    在pycharm 中添加运行参数的操作方法

    今天小编就为大家分享一篇在pycharm 中添加运行参数的操作方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • python datetime 和时间戳互相转换问题

    python datetime 和时间戳互相转换问题

    time和datetime都是Python中的内置模块(不需要安装,直接可以使用),都可以对时间进行获取,对时间格式进行转换,如时间戳和时间字符串的相互转换,本文先给大家介绍python datetime 和时间戳互转问题,感兴趣的朋友一起看看吧
    2022-11-11

最新评论