python对象、引用、全局变量和局部变量的关系

使用的python的过程中,习惯性按照C++的思维来理解python,导致一些困惑,例如下面这个例子。

ga是一个全局变量,lb是函数fun()里面的局部变量,而且在函数fun()里面先把lb赋值给ga后,lb的n才被赋值为2,当这个函数执行完以后,ga.n竟然也跟着变为2了。


>>> class cls(object):
...   n = 1
...
>>> ga = cls()
>>> ga.n = -1
>>> print ga.n
-1
>>> def fun():
...   global ga
...   lb = cls()
...   ga = lb
...   lb.n = 2
...   print lb.n
...
>>> fun()
2
>>> print ga.n
2
>>> print lb.n
Traceback (most recent call last): 
File "<stdin>", line 1, in <module>NameError: name 'lb' is not defined
>>> print ga.n
2

因为python通过引用来访问数据的值。


引用是什么?
引用是对象的别名,对象和引用的关系就像是你的大名和小名的关系,都能找到你。

所以在python里面,不管是全局变量还是局部变量,都是引用。

这和c语言是不一样的,大家应该都记得学习c语言时候那个著名的交换数据的swap函数,函数的参数是形参就是不能交换成功,得定义为引用才行。

但话又说回来,变量还是会区分作用域的,例如lb在函数外访问就报not defined,如例子所示。

好了,现在明白了。

下面再给出点补充知识,来自《python技术手册》第二版4.3节“变量和其他应用”
1.不管是全局变量还是局部变量,只要存在对对象的引用,对象就不会消失,始终保持在内存

2.引用可以表现为变量、属性和项目的形式
3.通过赋值语句(=),将对象的引用绑定到变量上;通过del语句,可以取消对引用的绑定
4.对象的属性(attribute)和项目(item)之间的区别在于访问的语法不同。对象的属性是通过该对象的引用,后面再带一个点号和属性名来表示;项目是通过该对象的引用,后面带一个方括号中的表达式来表示的。方括号的表达式被称为该项目的索引(index)或键(key),而该对象被成为这个项目的容器(container)。



美貌与智慧并重如你,一定会关注我的公众号zhixin991


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值