0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

python变量名解析

jf_78858299 来源:梯阅线条 作者:小梯子 2023-04-06 15:05 次阅读

点号和无点号变量名,用不同的处理方式。

(1) 无点号的变量名,比如X,使用的是作用域。

(2) 有点号的变量名,比如obj.X,使用对象的命名空间。

(3) 模块和类对对象的命名空间进行初始化。

1.1 无点号变量名

无点号变量名遵循LEGB作用域规则。

1.1.1 赋值本地变量

X = value

赋值语句,使变量名成为本地变量。

1.1.2 引用变量

引用变量X时根据LEGB作用规则搜索变量X:当前本地作用域搜索,之后在嵌套的函数中搜索,然后在全局作用域搜索,最后在内置作用域搜索。

1.2 点号变量名

点号的变量名是特定对象的属性。

1.2.1 命名空间赋值

obj.X = value

在进行点号运算的对象obj的命名空间内创建或修改属性名X。

1.2.2 引用点号变量

obj.X

类:先在对象内搜索变量名X,然后在可读取的超类上使用继承搜索变量名X。

模块:直接从模块读取X。

1.3 python变量名分类

python变量赋值位置决定了变量的作用域或命名空间,即变量可访问范围。

NO 赋值位置 分类 描述
1 模块顶层赋值 全局变量 都可访问
2 函数内部赋值 本地变量 函数内部可访问
3 方法内部赋值 本地变量 方法内部可访问
4 类主体内赋值 类数据属性 类、实例和行为可访问
5 方法self赋值 实例属性 实例可访问

1.3.1 模块内访问变量

# vars.py
# 模块属性
X = 91

def f1():
   print(X)
   
def f2():
   # 函数本地变量
   X = 92
   print(X)
   
class C1(object):
   # 类属性
   X = 93
   def m1(self):
       # 方法本地变量
       X = 94
       # 实例属性
       self.X = 95
       
if __name__ == '__main__':
   print(X)    # 91
   f1()        # 91
   f2()        # 92
   print(X)    # 91
   
   c = C1()
   print(c.X)  # 93
   
   c.m1()
   print(c.X)  # 95
   print(C1.X) # 93
   
   try:
       # 函数外不可访问本地变量
       print(f2.X)
   except Exception as e:
       print('f2.X={}'.format(e))
   
   try:
       # 方法外不可访问本地变量
       print(C1.m.X)
   except Exception as e:
       print('C1.m.X={}'.format(e))
       
''' 运行结果
E:\\documents\\F盘>python vars.py
91
91
92
91
93
95
93
f2.X='function' object has no attribute 'X'
C1.m.X=type object 'C1' has no attribute 'm'
'''

1.3.2 模块外访问变量

>>> import os
>>> os.chdir(r'E:\\documents\\F盘')
>>> import vars
>>> X = 96
>>> print(X)
96
>>> print(vars.X)
91
>>> vars.f1()
91
>>> vars.f2()
92
>>> print(vars.C1.X)
93
>>> c = vars.C1()
>>> print(c.X)
93
>>> c.m1()
>>> print(c.X)
95

1.3.3 global和nonlocal变量

python的global语句用于def函数内定义全局变量。在函数外也可以引用此变量。

python中如果要修改嵌套作用域变量的值,就用nonlocal语句。

>>> S = '梯阅线条'
>>> def g1():
   print(S)

>>> def g2():
   global S
   S = 'tyxt'
   
>>> g1()
梯阅线条
>>> g2()
>>> print(S)
tyxt

>>> def n1():
   S = 9555
   def n11():
       print(S)
   return n11

>>> n1()()
9555
>>> def n2():
   S = 9555
   def n21():
       nonlocal S
       print(S)
       S = 9666
       print(S)
   return n21

>>> n2()()
9555
9666
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    3882

    浏览量

    61310
  • python
    +关注

    关注

    51

    文章

    4677

    浏览量

    83468
收藏 人收藏

    评论

    相关推荐

    JAVA语言的变量和常量

    ;   float  b,c,d;其中类型说明了变量能存放什么格式的数据。变量名是用来标识该变量的,存取变量的内容(
    发表于 12-06 00:22

    就是一个文件下的两个文件夹里的全局变量名一样。。。在

    就是一个文件下的两个文件夹里的全局变量名一样。。。在打开一个时总是从另外一个文件夹里调用全局变量waring。。。请问该怎么解决
    发表于 11-12 20:41

    keil 4.7仿真,Watch窗口不能保存住变量名

    我用的STM32F303的单片机,仿真器是ULink2,每次仿真的变量名存到watch窗口后,可以正常观察到变量值,但是退出仿真再次进入后,变量都消失了,请教大家,这是怎么回事?如何才能是变量
    发表于 04-01 17:30

    Makefile——$(变量名)

    $(变量名) 表示的是此变量的值,如$(object)表示的是变量object的值;举个例子:objects = main.o kbd.o command.o display.o edit : $(objects)等价于 edi
    发表于 03-08 17:02

    关于C6678调试——变量名解析的问题

    TI 专家: 在使用C6678上EVM板调试时,尝试编写一个在PC上运行的程序(或者函数)使得输入DSP中的一个全局变量名能返回这个全局变量的地址。就类似于调试工具中的view->
    发表于 06-21 17:58

    请问STM32头文件里宏定义变量名是不是重复了?

    比如在 stm32f10x_map.h 头文件里,有下面这样宏定义和指针变量名相同的:这里是宏定义#ifdef _PWR#define PWR((PWR_TypeDef *) PWR_BASE
    发表于 09-04 09:28

    请问21489的引脚变量名在哪里找?

    新手问下,21489的引脚变量名在哪里找?我看例程里的好多表示引脚的变量,找了好几个头文件,都没有找到
    发表于 03-05 15:00

    阿里巴巴禁止开发人员使用isSuccess作为变量名的原因是什么

    为什么阿里巴巴禁止开发人员使用isSuccess作为变量名
    发表于 04-08 14:46

    Python的字符串与变量名

    字符串字面量与变量名的区别Python解释器如何判别字符串字面量与变量名字符串字面量的引号不是值的一部分
    发表于 05-22 07:23

    SFR变量名后如何才能找到一个特定的MC

    在下面的函数中,所有这些变量名被分配到某个地方。我假设它发生在xc.h头的某个地方。我的问题是我怎样才能找到一个特定的MC呢?他们在哪里上市?它们总是逐字匹配数据表的名称吗?无效intTimer
    发表于 04-27 14:00

    2.1 python常量与变量

    变量,比如常用的数学常数圆周率就是一个常量。在Python中,通常用全部大写的变量名表示常量:>>> PI = 3.***>>> PI3.***但事实上,从
    发表于 02-16 18:34

    python私有变量和私有方法

    python私有变量和私有方法1. 下划线妙用在 Python 中,下划线可是非常推荐使用的符号:变量名推荐使用下划线分隔的蛇形命名法魔法方法、构造函数都需要使用双下划线对于暂时用不到
    发表于 03-08 16:30

    请问21489的引脚变量名在哪里找?

    新手问下,21489的引脚变量名在哪里找?我看例程里的好多表示引脚的变量,找了好几个头文件,都没有找到
    发表于 11-30 06:35

    Python私有变量的定义方法

    在类内部使用,不被外部调用,且当变量被标记为私有后,调用时需再变量的前端插入类名,在类名前添加一个下划线,即“_ClassName__变量名”形式。Python私有
    发表于 02-13 16:49 1449次阅读

    90条关于写Python 程序的建议

    区分变量、使用容易混淆的变量名、害怕过长变量名等。有时候长的变量名会使代码更加具有可读性。 (2)深入学
    的头像 发表于 05-31 10:12 1224次阅读