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"对象。

python全局变量怎么定义(python变量的定义和使用方法)(1)

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()
  1. 输出:
  2. tom
  3. [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]

总结:在函数参数传递时候相当于是给变量指向的一份拷贝,函数参数即相当于局部变量,所以函数中可以修改变量指向