关于Python中的引用传值
来源:互联网 发布:韩国警匪片 知乎 编辑:程序博客网 时间:2024/04/27 22:32
学习了Python后,感觉到对Python里的引用传值有些疑惑,搜集了一些资料,同时编了一些实例,在此对引用传值解惑一下,分享给大家。
在Python里,一切事物皆为对象,并且规定参数的传递都是对象的引用。python参数传递都是“传对象引用”方式。实际上相当于c++中传值和传引用的结合。
首先我们可以看一下c++里传值的方法:
#include<iostream>#include<cstdlib>using namespace std;int main(){int a = 1;int b = a;int &c = a;b = 2; //值传递 cout << a << b << endl;c = 2;//引用传值 cout << a << b << c << endl; system("pause");return 0;}
输出结果为:
12
222
可以看出在引用传值下,改变了b的值,a和c的值也会改变,而在值传递下,改变b的值,原始数据a的值并不会改变。
在Python下:
a = 2b = aprint("a=%d &a=%d"%(a,id(a)))print("b=%d &b=%d"%(b,id(b)))b = 1 print("a=%d &a=%d"%(a,id(a)))print("b=%d &b=%d"%(b,id(b)))
输出结果为:
a=2 &a=34585356b=2 &b=34585356a=2 &a=34585356b=1 &b=34585368
不免令人费解,我们知道Python下都是引用传值,而在这里改变b的值后,原始数据a的值却并没有改变。但是从输出的地址值我们可以看出改变后的b,其地址值也改变了,我们可以得出结论,改变b的值之后,我们创建了一个新的对象,因而a的值并没有被改变,这是关于不可变对象。同时还会有以下类似情况发生:
def swap(a,b):a, b = b, areturn m, n = 3, 4swap(m, n)print(m,n)
输出结果为:(3,4)
可见不可变对象的参数传递类似于值传递,并没有交换m和n。交换函数可以这样写:
def swap(a,b):return b, am, n = 3, 4m, n = swap(m, n)print(m,n)
或者用一句话便可搞定:
m, n = n, m
可见Python的简洁性!
但是如果我们进行可变对象的传递,结果会怎样?如下代码:
c = [1,2,3]d = cprint(c)print(d)d.append(3)print(c)print(d)
输出结果为:
[1, 2, 3]
[1, 2, 3]
[1, 2, 3, 3]
[1, 2, 3, 3]
可以看出,对于可变对象,其完全符合引用传递的特点!
阅读全文
2 0
- 关于Python中的引用传值
- 关于Python中的引用
- python中的传值和传引用
- 关于c#中的传值与引用
- Python中的引用计数
- 注意python中的引用
- python中的引用
- Python中的引用
- python中的引用
- python中的引用
- 关于参数中的引用
- 关于c++中的引用
- 关于C++中的引用
- 关于引用传值&变量
- 监控Python中的引用计数
- 注意python中的引用问题
- python中的类的引用
- Python 中的引用与复制
- string 中截取int或double
- ubuntu下,对于终端字体颜色的设置
- 什么是AngularJs?特点是什么?和JQuery什么区别和联系?
- dwr3实现服务器向客服端精准推送消息实例详解
- Invalid ROM Table原因及解决办法
- 关于Python中的引用传值
- #if和if区别
- Android学习笔记——网络技术
- 389. Find the Difference
- 我是该用 MySQLi ,还是 PDO?
- 实体间属性copy使用@JsonIgnoreProperties忽略部分属性
- Java操作Window注册表
- 百炼-2749-分解因数-C语言-递归算法
- 动态生成二维码图片后通过js(JavaScript)或jq实现网页图片转base64格式下载