您的位置:首页 > 编程语言 > Python开发

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

2016-11-22 08:50 597 查看
使用的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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: