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]这个对象上。

过程如图:

image

多个变量赋值

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的局部作用域了。

posted @ 2016-07-18 17:49  付建功  阅读(341)  评论(0编辑  收藏  举报