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 ...
随机推荐
- sftp ftp文件同步方案
sftp ftp文件同步方案 1. 需求 1.1实现网关服务器的ftp服务器的/batchFileRequest目录下文件向徽商所使用的sftp服务器的/batchFileRequest目录同步文件 ...
- cmd启动MySQL服务器发生错误
Mysql net start mysql启动,提示发生系统错误 5 拒绝访问 原文:https://blog.csdn.net/angel_guoo/article/details/7919037 ...
- Django生成二维码
1. 安装 pip install qrcode 安装Image包 pip install Image 1.1 在代码中使用 import qrcode img = qrcode.make('输入一个 ...
- Go:channel
一.channel 在 Go 语言里,不仅可以使用原子函数和互斥锁来保证对共享资源的安全访问以及消除竞争状态,还可以使用 channel,通过发送和接收需要共享的资源,在 goroutine 之间做同 ...
- 如何用纯 CSS 创作文本滑动特效的 UI 界面
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/QrxxaW 可交互视频教 ...
- MySQL数据库之-foreign key 外键(一对多、多对多、一对一)、修改表、复制表
摘要: 外键 一对多 外键 多对多 外键 一对一 --------------------------------------------------------------------------- ...
- Spring MVC 接入 rabbitMQ
依赖包 <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spr ...
- He'llWorld_Struts2
[步骤] 1.创建web项目 2.导入相关jar包 3.配置核心过滤器 web app libraris ---> struts-core ---> org.apache.struts2 ...
- idea 中使用 出现 svn: E155036
在idea中使用svn checkout时 svn出现如上错误. 原因本地的工作副本太旧.command line进入本地工作副本的根目录,执行svn upgrade后 重启idea就可以了.
- Codeforces Round #211 (Div. 2)-D. Renting Bikes,二分!感谢队友出思路!
D. Renting Bikes 读懂题后一开始和队友都以为是贪心.可是贪心又怎么贪呢..我们无法确定到底能买多少车但肯定是最便宜的前x辆.除了公共预算每个人的钱只能自己用,也无法确定每个人买哪一辆车 ...