本文暂时不讨论类定义中的变量(成员)作用域,改天可能会单独成文介绍。
变量作用域总起来说可以这么理解:1)在函数内如果只引用某个变量的值而没有为其赋新值,该变量为(隐式的)全局变量;2)如果在函数内某条代码有为变量赋值的操作,该变量从此之后就被认为是(隐式的)局部变量,除非在函数内该代码之前显式地用关键字global进行了声明。
>>> def demo():
global x #声明或创建全局变量
x = 3 #修改全局变量的值
y =4 #局部变量
print(x, y)
>>> x = 5 #在函数外部定义了全局变量x
>>> demo() #本次调用修改了全局变量x的值
3 4
>>> x
3
>>> y #局部变量在函数运行结束之后自动删除
NameError: name 'y' is not defined
>>> del x #删除了全局变量x
>>> x
NameError: name 'x' is not defined
>>> demo() #本次调用创建了全局变量
3 4
>>> x
3
如果局部变量与全局变量具有相同的名字,那么该局部变量会在自己的作用域内隐藏同名的全局变量,例如下面的代码所演示。
>>> def demo():
x = 3 #创建了局部变量,并自动隐藏了同名的全局变量
print(x)
>>> x = 5 #创建全局变量
>>> x
5
>>> demo()
3
>>> x #函数调用结束后,不影响全局变量x的值
5
除了局部变量和全局变量,Python还支持使用nonlocal关键字定义一种介于二者之间的变量。例如下面的代码:
def scope_test():
def do_local():
spam = "我是局部变量"
def do_nonlocal():
nonlocal spam #这时要求spam必须是已存在的变量
spam = "我不是局部变量,也不是全局变量"
def do_global():
global spam #如果全局作用域内没有spam,就自动新建一个
spam = "我是全局变量"
spam = "原来的值"
do_local()
print("局部变量赋值后:", spam)
do_nonlocal()
print("nonlocal变量赋值后:", spam)
do_global()
print("全局变量赋值后:", spam)
scope_test()
print("全局变量:", spam)
上面的代码运行结果为:
局部变量赋值后: 原来的值
nonlocal变量赋值后: 我不是局部变量,也不是全局变量
全局变量赋值后: 我不是局部变量,也不是全局变量
全局变量: 我是全局变量
思考题:如果有下面的类框架,要求把其中的pass替换为有效代码,实现并模拟数据结构中“双链表”,你会怎么写呢?明天会把我写的代码贴出来以便大家参考和对照,当然在这之前可以先参考一下这个Python实现单链表。
class Node:
'''双链表节点结构'''
def __init__(self, data, leftNode=None, rightNode=None):
#设置当前节点的值和指向下一个节点的指针
self.data = data
self.left = leftNode
self.right = rightNode
def insertAfter(self, node):
#在当前节点之后插入新节点node
pass
def insertBefore(self, node):
#在当前节点之前插入新节点node
pass
def deleteAfter(self):
#删除当前节点之后的节点
pass
def deleteBefore(self):
#删除当前节点之前的节点
pass