您当前的位置:首页 > 计算机 > 编程开发 > Python

详解Python变量作用域

时间:09-09来源:作者:点击数:

本文暂时不讨论类定义中的变量(成员)作用域,改天可能会单独成文介绍。

变量作用域总起来说可以这么理解: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

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门