文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

python 变量和作用域

2023-01-30 21:58

关注

变量作用域

python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。


变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。python的作用域一共有4种,分别是:


L (Local) 局部作用域

E (Enclosing) 闭包函数外的函数中

G (Global) 全局作用域

B (Built-in) 内建作用域


L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。


x = int(2.9)  # 内建作用域
g_count = 0  # 全局作用域
def outer():
    o_count = 1  # 闭包函数外的函数中
    def inner():
        i_count = 2  # 局部作用域


举个例子

name = "Li Si"
def change_name(name):
    print("before change:", name)
    #局部变量,这个函数就是这个变量的作用域
    name = "Zhang San"
    print("after change", name)

change_name(name)
print(name)

执行输出

before change: Li Si

after change Zhang San

Li Si


最后一行打印的name,并没有改变。


局部变量是在某个函数中声明的,只能在该函数中调用它,如果试图在超出范围的地方调用,程序就会出错

例如:

name = "Li Si"
def change_name(name):
    print("before change:", name)
    #局部变量,这个函数就是这个变量的作用域
    name = "Zhang San"
    print("after change", name)
    age = 23

change_name(name)
print(age)

执行报错

NameError: name 'age' is not defined


全局变量

在程序的一开始定义的变量称为全局变量。

因为代码是从上往下执行的,所以全局变量,必须在程序的头部位置。


举个例子

#全局变量
city = "beijing"
def change_name(name):
    city = "shanghai"
    print("before change:", name,city)
    #局部变量,这个函数就是这个变量的作用域
    name = "Zhang San"
    print("after change", name)

name = "Li Si"
change_name(name)
print(name)
print(city)

执行输出

before change: Li Si shanghai

after change Zhang San

Li Si

beijing


全局与局部变量


在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。

全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。

当全局变量与局部变量同名时:

在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。


上面的例子中,city变量没有受到局部变量的影响。


如果函数内部,一定要改全局变量呢?需要用global关键字声明才可以

#全局变量
city = "beijing"
def change_name(name):
    global city
    city = "shanghai"
    print("before change:", name,city)
    #局部变量,这个函数就是这个变量的作用域
    name = "Zhang San"
    print("after change", name)

name = "Li Si"
change_name(name)
print(name)
print(city)

执行输出

before change: Li Si shanghai

after change Zhang San

Li Si

shanghai


另外一种全局变量写法,不推荐这么做

def change_name():
    global name
    name = "wang"

change_name()
print(name)

执行输出 wang


为什么不推荐这么做?因为只有当函数执行的时候,定义的全局变量才会改变。否则不会生效。

这种写法,要被骂街的。


函数内部修改列表

city = "beijing"
names = ["jack","rose","tom"]
def change_name():
    names[0] = "frank"
    print("inside",names)

change_name()
print("outside",names)

执行输出

inside ['frank', 'rose', 'tom']

outside ['frank', 'rose', 'tom']


为什么都一样呢?

只有字符串,整数这种类型时,不能在函数内部更改全局变量。

稍微复杂一点的,比如列表,字典,集合,类,都是可以在函数内部更改的。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯