1.1变量概念
everythinginPythonisanobject.Allthedatatypessuchasnumbers,strings,functions,classesareallobjects.Andanameactsasareferencetogettotheobjects.
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=5deftest():a=2printatest()printa
正常输出:
2
5
[Finishedin0.1s]
总结:函数作用域中变量查找顺序先查找局部变量,有局部变量直接使用局部变量
例2:
name='tom'deftest():printnametest()
- 输出:
- tom
- [Finishedin0.2s]
总结:函数作用域中先查找局部变量,找不到就会查找全局变量,并可以读取全局变量。这里打印name时候查找name变量,先查找局部name没有找到,再查找全局name,找到了然后输出。
例3:
name='tom'deftest():ifname=='li':printnameelse:name='tim'printnametest()
执行报错:UnboundLocalError:localvariable'name'referencedbeforeassignment
总结:
1.所有的变量必须在其使用前明确地赋值,使用未赋值的变量会产生错误。
2.函数作用域中可以引用全局变量,但不能直接修改全局变量的地址指向
例4:
name=['tom']deftest():ifname=='li':printnameelse:name.append('tim')printnametest()
正常输出:
['tom','tim']
[Finishedin0.2s]
总结:虽然函数中不能直接修改全局变量地址指向,但是当全局变量是可变对象时,可以修改全局变量内容。补充说一下python中字符串、元组等是不可变对象,列表是可变对象,具体后面讨论。
例5:
name='tom'deftest():globalnameifname=='li':printnameelse:name='tim'printnametest()
正常输出:
tim
[Finishedin0.2s]
总结:如果函数中的变量是引用的全局变量,正常情况下函数中不能包含对该变量直接重新赋值的代码,如果必须重新赋值那么需要在函数中先通过global引用。
例6:
a=5deftest(a):ifa:a=2printatest(a)printa
结果为:
2
5
[Finishedin0.1s]
总结:在函数参数传递时候相当于是给变量指向的一份拷贝,函数参数即相当于局部变量,所以函数中可以修改变量指向