这里有新鲜出炉的 Python 多线程编程,程序狗速度看过来!
Python 是一种面向对象、解释型计算机程序设计语言,由 Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年。Python 语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够把用其他语言制作的各种模块(尤其是 C/C++)很轻松地联结在一起。
下面小编就为大家带来一篇老生常谈 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 函数参数的区别 (必看篇) 就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持 PHPERZ。
来源: http://www.phperz.com/article/17/0614/336227.html