python 变量和作用域

变量作用域

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']

为什么都一样呢?

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏郭耀华‘s Blog

TensorFlow 使用变量共享

TensorFlow中的变量一般就是模型的参数。当模型复杂的时候共享变量会无比复杂。

1411
来自专栏数据分析

char varchar nchar nvarcharar到底有多大区别

首先说明下,ASP.NET MVC系列还在龟速翻译中。 工作好多年,基础知识甚是薄弱,决定以后在coding(cv操作)的时候尽量多google下,然后总结下来...

2986
来自专栏轮子工厂

嘿~这里有一份超实用的 switch 教程,真的好想推荐给你

在上次推文中介绍了关系运算符和条件运算符,今天介绍它们的好搭档,分支结构。如下图所示,左侧是顺序结构,右侧是分支结构

911
来自专栏javathings

解释一下 HashMap 的工作原理

HashMap 是基于散列表的数据结构。所谓散列表,它通过键值对的方式存储数据,把 key 通过散列算法计算出一个存储地址,将 value 放入这个地址中。散列...

3211
来自专栏Python自动化测试

python内部函数学习(九)

python提供了很多的内置函数,这些内置的函数在某些情况下,可以起到很大的作用,而不需要专门去写函数实现XX功能,直接使用内置函数就可以实现,下...

1093
来自专栏浪淘沙

Python学习总结4--字符串和编码

一、编码历史     由于计算机是美国人发明的,因此,最早只有127个字符被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCI...

1264
来自专栏JavaEdge

(六)-class文件结构1 什么是JVM的“无关性”?2 纵观Class文件结构

2948
来自专栏云霄雨霁

设计模式----组合模式

1270
来自专栏xingoo, 一个梦想做发明家的程序员

剑指OFFER之用两个栈实现队列(九度OJ1512)

题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 输入: 每个输入文件包含一个测试样例。 对于每个测试样例,第一...

1956
来自专栏决胜机器学习

PHP数据结构(八) ——赫夫曼树实现字符串编解码(实践2)

PHP数据结构(八)——赫夫曼树实现字符串编解码(实践2) (原创内容,转载请注明来源,谢谢) 公众号规定不能超过3000字,只能分两篇,见谅。 由于需要分两篇...

3506

扫码关注云+社区

领取腾讯云代金券