Python函数参数传递
Python中函数参数的传递是采用传值方式,但是和C/C++有所不同
C/C++方式
void fun(int a)
{
a = 10;
} void main()
{
int c =3;
fun(c);
}
上面示例,c最终的值是3.因为c是将3这个值传递给了fun,其本身的值没有变。fun函数在使用3这个值时,又申请了一个临时的存储空间,这个存储空间在调用函数结束后被销毁。
void fun(int *a)
{
*a = 10
} void main()
{
int c =3;
fun(&c);
}
上面的示例,c最终的值是10.函数还是采用传值的方式,但是以为定义的是指针变量,所以fun函数认为传递的值是一个地址。修改指针变量指向的存储空间地址的内容,也就是修改c的内容。
Python的方式
变量 VS 类型
python的变量是没有类型的,所有的变量可以理解成是内存中一个对象的“引用”,用c来表示就是 void *。所以并不像c语言里面有某某类型变量的说法。比如
int a =1;
上面可以表述为 a 是一个int型变量
a = 1
上面不能像c那样理解。a只是一个“指针”,这个“指针”指向一个int型的对象
可更改(mutable)与不可更改(immutable)对象
在Python中,strings,numbers,tuples是不可更改对象,list,dict是可更改对象。对比c语言理解
int a = 1;
a =2;
a = 1
a = 2
两种方式a最终的结果都是2.但是处理方式是不一样的。在c语言中,是给a申请了一个存储空间,并给这个存储空间赋值为1,随后改成2.在python中,是在内存中建立一个值为1的对象,并使a“指向”它,随后赋值为2的时候,并不是修改这个值为1的对象,而是将其抛弃。重新申请一个值为2的对象,并使a“指向”它。这是因为numbers对象是不可更改的
a = [1]
a[0]=2
同理,这里构建了一个list对象,并使a指向它,但是因为list对象是可以改变的。所以list的第0个元素的值发生了改变。用c链表表述的话,就是原来指向int型变量值为1的指针重新定向到了指向int型变量的值为2的指针。
typedef list int *;
int a[3] ={1};
list = a;
*(list) = 2;
可以看到list并没有
赋值与引用
a = 4
b = a
b = 5
上面脚本的输出结果为:
a = 4 b =5
a = [3,4]
b = a
b[0] = 10
上面的脚本输出结果
a = [10 ,4] b =[10 , 4]
可以看出,number是赋值,而列表是引用。
Python函数传值
所以结果很明显了,当传递immutabble对象时,被传递对象无法被改变,当传递mutable时,被传递对象可以被改变。
def fun(a):
a = 10 b = 2
fun(b)
当b传递给fun时,a和b都指向2这个不可更改的对象。当fun函数给a赋值,因为对象不可更改,所以只能新建一个对象,并将a重新指向它,而b的值并没有改变。
def fun(a):
a[0] = 10 b = [2]
fun(b)
同上,但是list对象是可以被改变的,a和b同时指向了这个list对象,所以在fun函数中发生的修改,使b指向的list的值发生了改变。
Python函数参数传递的更多相关文章
- Python 函数参数传递机制.
learning python,5e中讲到.Python的函数参数传递机制是对象引用. Arguments are passed by assignment (object reference). I ...
- Python 函数 参数传递
参数传递 在 python 中,类型属于对象,变量是没有类型的: a=[1,2,3] a="Runoob" 以上代码中,[1,2,3] 是 ...
- [蟒蛇菜谱]Python函数参数传递最佳实践
将函数作为参数传递,同时将该函数需要的参数一起传递.可参考threading.Timer的处理方式: class threading.Timer(interval, function, args=[] ...
- python函数的参数传递问题---传值还是传引用?
摘要:在python中,strings, tuples, 和numbers是不可更改的对象,而list,dict等则是可以修改的对象.不可更改对象的传递属于传值,可更改对象属于传引用.想要在函数中传递 ...
- Python 函数的参数传递
C/C++中,传递参数的类型是可以指定的.一般来说,传递参数可以分为两种:值传递和引用传递.对于值传递,参数传递的过程中进行了复制操作,也就是说,在函数中对参数的任何改动都不会影响到传入的变量:对于引 ...
- Python 函数中,参数是传值,还是传引用?
在 C/C++ 中,传值和传引用是函数参数传递的两种方式,在Python中参数是如何传递的?回答这个问题前,不如先来看两段代码. 代码段1: def foo(arg): arg = 2 print(a ...
- python函数和lambda表达式学习笔记
1. python函数 不同于其他语言,python支持函数返回多个值 为函数提供说明文档:help(函数名)或者函数名.__doc__ def str_max(str1, str2): ''' 比较 ...
- Python语言特性之1:函数参数传递
问题:在Python文档中好像没有明确指出一个函数参数传递的是值传递还是引用传递.如下面的代码中"原始值"是不放生变化的: class PassByReference: def _ ...
- Python学习笔记之函数参数传递 传值还是传引用
在学完Python函数那一章节时,很自然的的就会想到Python中函数传参时传值呢?还是传引用?或者都不是? 在回答上面的问题之前我们先来看看下面的代码: 代码1: def foo(var): v ...
随机推荐
- ImportError: pycurl: libcurl link-time ssl backend (nss) is different
reference pip uninstall pycurl export PYCURL_SSL_LIBRARY=nss easy_install pycurl
- java 数据库(二)
1.SQL概述 1.什么是SQL(了解): 结构化查询语言,是一种功能齐全的数据库语言.在使用它时,只需要发出“做什么”的命令,“怎么做”是不用使用者考虑的 SQL被美国国家标准局(ANSI)确定为关 ...
- Eclipse 总是在编译的时候卡住
之前在开发Unieap项目的时候都是很正常,突然有一天早上总是出现Eclipse在编译的时候卡到34%的位置. 解决办法: 点击停止校验,一直卡在那里,首先在任务管理器杀死eclipse和javaw进 ...
- strong&weak
copy:建立一个索引计数为1的对象,然后释放旧对象 对NSString对NSString 它指出,在赋值时使用传入值的一份拷贝.拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协议 ...
- Mysql 查询多个字段去重复
今天需要统计信息,但是有过个重复的数据,需要去除,找了如下方法: SELECT *, COUNT(DISTINCT phone ) FROM apply_info GROUP BY phone
- set指令详解
set指令详解 功能说明:设置shell 语 法:set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...] 说 明:设置或取消设置shell选项 ...
- 蓝牙bluez学习(1) Stack Architecture
Bluez支持的features Core Specification 4.2 (GAP, L2CAP, RFCOMM, SDP, GATT) Classic Bluetooth (BR/EDR) B ...
- CSS3---媒体查询与响应式布局
1. 值 设备类型 All 所有设备 Braille 盲人用点字法触觉回馈设备 Embossed 盲文打印机 Handheld 便携设备 Print 打印用纸或打印预览视图 Projection 各种 ...
- gcc编译详解
GCC(GNU Compiler Collection,GNU编译器套件),是由 GNU 开发的编程语言编译器.它是以GPL许可证所发行的自由软件,也是 GNU计划的关键部分.GCC原本作为GNU操作 ...
- perl学习之:package and module
perl的包(package)和模块(PM) ==================================包package=========================== pac ...