前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >详解Python变量作用域

详解Python变量作用域

作者头像
Python小屋屋主
发布2018-04-16 14:55:29
1.5K0
发布2018-04-16 14:55:29
举报
文章被收录于专栏:Python小屋Python小屋Python小屋

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-11-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python小屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档