1.1 变量概念
everything in Python is an object. All the data types such as numbers, strings, functions, classes are all objects. And a name acts as a reference to get to the objects.
Python 变量名的创建是通过把类型的实例赋值给它们。变量本身并没有类型,而与它们绑定在一起的对象拥有类型。变量只是一个名称,它也可以被一个完全不同的对象重新赋值。
赋值操作使用=操作符,所以把一个值赋给一个变量就如下所示:
aVariable = aValue
这段代码把值aValue 绑定到变量名aVariable 上。如果此变量名不存在,解释器会把这个名称添加到合适的命名空间中。命名空间后续讨论。
因此,在Python 中区别变量和它指向的对象是非常重要的,对象可以理解为分配的一块内存。
比如 定义name="tom"
当变量name被赋值为"tom"之后就可以理解为这个变量名称name指向了“tom"这个对象
当再次定义name="tim"
此时变量名称name就指向了tim这个对象, 而不再指向原来的"tom"对象。
1.2 变量判断
is用于判断两个变量是否指向同一个对象
== 用于判断两个变量指向的对象内容是否相等
1.3 变量种类
先简单理解,变量根据作用域不同分为全局变量和局部变量。更多的LEGB后面再讨论。
1.4 实例演示
下面我们用一些具体的示例加深对变量的理解。
例1:
a=5 def test(): a=2 print a test() print a
正常输出:
2
5
[Finished in 0.1s]
总结:函数作用域中变量查找顺序先查找局部变量,有局部变量直接使用局部变量
例2:
name='tom' def test(): print name test()
- 输出:
- tom
- [Finished in 0.2s]
总结:函数作用域中先查找局部变量,找不到就会查找全局变量,并可以读取全局变量。这里打印name时候查找name变量,先查找局部name没有找到,再查找全局name,找到了然后输出。
例3:
name='tom' def test(): if name == 'li': print name else: name = 'tim' print name test()
执行报错:UnboundLocalError: local variable 'name' referenced before assignment
总结:
1.所有的变量必须在其使用前明确地赋值,使用未赋值的变量会产生错误。
2.函数作用域中可以引用全局变量,但不能直接修改全局变量的地址指向
例4:
name=['tom'] def test(): if name == 'li': print name else: name.append('tim') print name test()
正常输出:
['tom', 'tim']
[Finished in 0.2s]
总结:虽然函数中不能直接修改全局变量地址指向,但是当全局变量是可变对象时,可以修改全局变量内容。补充说一下python中字符串、元组等是不可变对象,列表是可变对象, 具体后面讨论。
例5:
name='tom' def test(): global name if name == 'li': print name else: name = 'tim' print name test()
正常输出:
tim
[Finished in 0.2s]
总结:如果函数中的变量是引用的全局变量,正常情况下函数中不能包含对该变量直接重新赋值的代码,如果必须重新赋值那么需要在函数中先通过global引用。
例6:
a=5 def test(a): if a: a=2 print a test(a) print a
结果为:
2
5
[Finished in 0.1s]
总结:在函数参数传递时候相当于是给变量指向的一份拷贝,函数参数即相当于局部变量,所以函数中可以修改变量指向