使用的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