python变量
变量无类型,对象有类型
变量定义规则
- 变量名只能是字符、数字或下划线的任意组合
- 变量名的第一个字符不能是数字
- 变量名区分大小写
- python3中,非ASCII的字符也可作为变量名
- Python的保留字不能声明为变量名
>>> import keyword >>> keyword.kwlist ['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
变量赋值
python中的变量不需要类型声明。
变量就是变量,它没有类型,我们所说的“类型”是指变量所指的内存中对象的类型。
等号(=)用来给变量赋值。等号(=)运算符左边是变量名,右边是存储在变量中的值。
实例:
#!/usr/bin/env python # -*- coding: utf-8 -*- int_num = 100 # 赋值整形变量 float_num = 1000.0 # 赋值浮点型 name = "LuckyLye" # 赋值字符串 水果 = ['西瓜', '苹果', '香蕉'] print(int_num) print(float_num) print(name) print(水果)实例结果:
100 1000.0 LuckyLye ['西瓜', '苹果', '香蕉']python中所谓的变量赋值,其实没有赋值,只有引用。我们平时说的python变量其实只是标签,是引用。
执行:
values = [0, 1, 2]的时候,python首先在内存中创建一个对象[0, 1, 2],然后给它贴上名为values的标签。如果又执行:
values = [4, 5, 6]python会在内存中创建另外一个对象[4, 5, 6],然后把刚才的那张名为values的标签从前面的[0, 1, 2]对象上撕下来,然后贴到[4, 5, 6]这个对象上。
过程如图:
多个变量赋值
python允许你同时为多个变量赋值
实例:
#!/usr/bin/env python # -*- coding: utf-8 -*- a = b = c = 1 d, e, f = 2, 3, 'luckylye' g, h, i, j = [4, 5, 6, 7] print(a, b, c) print(d, e, f) print(g, h, i, j)实例结果:
1 1 1 2 3 luckylye 4 5 6 7
全局变量和局部变量
1.定义在函数内部的变量名如果第一次出现,且在‘=’符号前,那么就可以认为是被定义为局部变量。在这种情况下,不论全局变量中是否用到该变量名,函数中使用的都是局部变量。
实例:
#!/usr/bin/env python # -*- coding: utf-8 -*- num = 100 # 全局变量 def func(): num = 200 # 局部变量 print(num) func()实例结果:
200输出结果为200,说明函数中定义的变量名num是一个局部变量,覆盖全局变量。
如果函数内变量没有定义就使用,则会报错。
实例:
#!/usr/bin/env python # -*- coding: utf-8 -*- num = 100 # 全局变量 def func(): num += 100 print(num) func()实例结果:
UnboundLocalError: local variable 'num' referenced before assignment提示错误:局部变量num在赋值前被应用。由此证明这里定义的是一个局部变量,而不是全局变量
2.函数内部的变量名如果是第一次出现,且出现在‘=’符号后面,且在之前已被定义为全局变量,则这里将引用全局变量。
实例:
#!/usr/bin/env python # -*- coding: utf-8 -*- num = 100 # 全局变量 def func(): x = num + 100 print(x) func()实例结果:
200如果变量名num在之前没有被定义为全局变量,则会出现错误提示:变量没有定义。
实例:
#!/usr/bin/env python # -*- coding: utf-8 -*- def func(): x = num + 100 print(x) func()实例结果:
NameError: name 'num' is not defined
3.函数中如果使用某个变量时,如果该变量名既有全局变零又有局部变量,则默认使用局部变量。
实例:
#!/usr/bin/env python # -*- coding: utf-8 -*- num = 100 # 全局变量 def func(): num = 200 # 局部变量 x = num + 100 print(x) func()实例结果:
300
4.在函数中将某个变量定义为全局变量时需要使用关键字global。
实例:
#!/usr/bin/env python # -*- coding: utf-8 -*- num = 100 def func(): global num num = 200 print(num) func() print(num)输出结果:
200 200
作用域
作用域简单的说就是一个变量的命名空间,代码中变量被赋值的位置,就决定了哪些范围的对象可以访问这个变量,这个范围就是命名空间。python变量赋值时产生了变量名,也产生了它的当前作用域。
python的变量作用域一共有4种:
- L(local)局部作用域
- E(enclosing)闭包函数外的函数中
- G(global)全局作用域
- B(built-in)内建作用域
以 L --> E --> G –> B的顺序查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就去全局找,最后到内建找。
python中除了def/class/lambda外,其他如:if/elif/else/、try/except、for/while并不能改变其作用域。定义在他们之内的变量,外部还是可以访问。
实例:
if True: name = 'Luckylye' print(name)实例结果:
Luckylye如果if被 def/class/lambda包裹,在内部赋值,就变成了此def/class/lambda的局部作用域了。