导航:首页 > 编程语言 > python类作用域

python类作用域

发布时间:2024-06-15 19:05:46

python里面变量作用域是什么

变量作用域:python可以直接查找名称到对象的映射(命名空间)的部分。

python有built–in、global、enclosing、local这四种作用域

built–in:内建作用域,包含了内建的变量和关键字。

global:全局作用域,定义在所有函数外,当前模块(.py源文件)的全局变量。

enclosing:闭包函数外的函数(非局部也非全局),比如有一个函数a,a里有另一个函数b,对于b里的变量来说,a中的作用域就是enclosing。

local:局部作用域,脚本最内层,比如函数里。

Ⅱ Python 中作用域与命名空间的问题

i=2这一句是定义了一个局部变量i,并赋值为2;这个时候全局作用域的i会被屏蔽,所以全局变量i是没有被修改的所以结果是1;


访问全局变量时可以直接访问,但是修改全局作用域的时候一定要在赋值之前,进行如下声明:

deff():

globali


i=2


因为python里赋值语句和声明变量是一个体的,所以需要global来告诉解释器i是全局变量,接下来的i=2才能被当作是赋值

------------------追答---------------------

同一个代码块(作用域)里, 同一个变量的作用域只能是同一种或者说同一个变量只能来自同一个作用域, 不能是一会是局部变量然后又变成全局变量;

i = i + 1

首先前面的'i='表明了i是一个局部变量(没有global声明, 创建局部变量), 然后后面的'i+1'里的i自然也是局部变量(同一个函数下同一个变量,i已经是局部变量了, 不能再当作全局变量去用), 那么自然会报错, i在使用前未声明

i += 1

报错就更明显了, 没有global声明 那么再修改变量i的时候, 自然是当作局部变量, 使用前未声明

变量的查找顺序遵循 LEGB 可以自己网络

关于作用域给你再写个简单的示例, 你对照着理解一下

Ⅲ #抬抬小手学Python# Python 之作用域下的 global 和 nonlocal 关键字

该部分内容涉及 Python 变量作用域相关知识,变量作用域指的是变量的有效作用范围,直接理解就是 Python 中的变量不是任意位置都可以访问的,有限制条件。

一般情况下变量的作用域变化范围是 块级、函数、类、模块、包等,级别是从小到达。Python 中是没有块级作用域的,所以我们在写代码的时候,下面的代码是正确的。

在 Python 中常见的块级作用域有 if 语句、for 语句、while 语句、with 上下文语句。

上文已经提及了作用域是 Python 程序可以直接访问一个变量的作用范围,Python 的作用域一共有 4 种,分别如下:

一个比较经典的案例如下:

在 Python 中变量寻找的顺序是从内到外,先局部,然后外部,在全局,在内建,这种规则叫做 LEGB 规则 。

增加以下学习的趣味性,你可以研究下述代码中变量是如何变化的。

定义在 函数内部 的变量拥有一个局部作用域,定义在 函数外部 的变量拥有全局作用域。

输出结果,函数内部是 123 ,函数外部依旧是 0 。

如果希望函数内部(内部作用域)可以修改外部作用域的变量,需要使用 global 关键字。

此时输出的就都是 123 了,还有一点需要注意,在函数内容如果希望修改全局变量的值, global 关键字一定要写在变量操作前。

该代码会出现语法错误:

全局变量还存在一个面试真题,经常出现,请问下述代码运行结果。

如果要修改嵌套作用域(Enclosing 作用域)中的变量,需要 nonlocal 关键字,测试代码如下:

输出结果自行测试,注意 nonlocal 关键字必须是 Python3.X+版本,Python 2.X 版本会出现语法错误:

在多重嵌套中, nonlocal 只会上溯一层,如果上一层没有,则会继续上溯,下述代码你可以分别注释查看结果。

局部变量和全局变量具体有哪些,可以通过 locals() 和 globals() 两个内置函数获取。

本篇博客为大家说明了 Python 的作用域,并且对 global 和 nonlocal 关键字进行了学习,希望对你有所帮助。

Ⅳ 谈谈python中类属性和类实例的属性的区别

一般来说,在Python中,类实例属性的访问规则算是比较直观的。

但是,仍然存在一些不是很直观的地方,特别是对C++和Java程序员来说,更是如此。

在这里,我们需要明白以下几个地方:

1.Python是一门动态语言,任何实体都可以动态地添加或删除属性。
2.一个类定义了一个作用域。
3.类实例也引入了一个作用域,这与相应类定义的作用域不同。
4.在类实例中查找属性的时候,首先在实例自己的作用域中查找,如果没有找到,则再在类定义的作用域中查找。
5.在对类实例属性进行赋值的时候,实际上会在类实例定义的作用域中添加一个属性(如果还不存在的话),并不会影响到相应类中定义的同名属性。

下面看一个例子,加深对上述几点的理解:

复制代码
代码如下:

class A:
cls_i = 0
cls_j
= {}
def __init__(self):
self.instance_i =
0
self.instance_j =
{}

在这里,我们先定义类A的一个实例a,然后再看看类A的作用域和实例a的作用域中分别有什么:

复制代码
代码如下:

>>> a = A()
>>>
a.__dict__
{'instance_j': {}, 'instance_i': 0}
>>>
A.__dict__
{'__init__': , '__mole__': '__main__', 'cls_i': 0, 'cls_j': {},
'__doc__': None}

我们看到,a的作用域中有instance_i和instance_j,A的作用域中有cls_i和cls_j。

我们再来看看名字查找是如何发生的:

复制代码
代码如下:

>>> a.cls_i
0
>>>
a.instance_i
0

在查找cls_i的时候,实例a的作用域中是没有它的,却在A的作用域中找到了它;在查找instance_i的时候,直接可在a的作用域中找到它。

如果我们企图通过实例a来修改cls_i的值,那会怎样呢:

复制代码
代码如下:

>>> a.cls_i = 1
>>>
a.__dict__
{'instance_j': {}, 'cls_i': 1, 'instance_i': 0}
>>>
A.__dict__
{'__init__': , '__mole__': '__main__', 'cls_i': 0, 'cls_j': {},
'__doc__': None}

我们可以看到,a的作用域中多了一个cls_i属性,其值为1;同时,我们也注意到A作用域中的cls_i属性的值仍然为0;在这里,我们其实是增加了一个实例属性,并没有修改到类属性。

如果我们通过实例a操纵cls_j中的数据(注意不是cls_j本身),又会怎么样呢:

复制代码
代码如下:

>>> a.cls_j['a'] =
'a'
>>> a.__dict__
{'instance_j': {}, 'cls_i': 1, 'instance_i':
0}
>>> A.__dict__
{'__init__': , '__mole__': '__main__',
'cls_i': 0, 'cls_j': {'a': 'a'}, '__doc__': None}

我们可以看到a的作用域没有发生什么变化,但是A的作用域发生了一些变化,cls_j中的数据发生了变化。

实例的作用域发生变化,并不会影响到该类的其它实例,但是类的作用域发生变化,则会影响到该类的所有实例,包括在这之前创建的实例:

复制代码
代码如下:

>>> A.cls_k = 0

Ⅳ Python语言中作用域怎么理解

命名空间 是从命名到对象的映射。当前命名空间主要是通过 Python 字典实现的,不过通常不关心具体的实现方式(除非出于性能考虑),以后也有可能会改变其实现方式。以下有一些命名空间的例子:内置命名(像 abs() 这样的函数,以及内置异常名)集,模块中的全局命名,函数调用中的局部命名。某种意义上讲对象的属性集也是一个命名空间。关于命名空间需要了解的一件很重要的事就是不同命名空间中的命名没有任何联系,例如两个不同的模块可能都会定义一个名为 maximize 的函数而不会发生混淆-用户必须以模块名为前缀来引用它们。
顺便提一句,我称 Python 中任何一个“.”之后的命名为 属性 --例如,表达式 z.real 中的 real 是对象 z 的一个属性。严格来讲,从模块中引用命名是引用属性:表达式 modname.funcname 中,modname 是一个模块对象,funcname 是它的一个属性。因此,模块的属性和模块中的全局命名有直接的映射关系:它们共享同一命名空间![1]
属性可以是只读过或写的。后一种情况下,可以对属性赋值。你可以这样做: modname.the_answer = 42 。可写的属性也可以用 del 语句删除。例如: del modname.the_answer 会从 modname 对象中删除 the_answer 属性。
不同的命名空间在不同的时刻创建,有不同的生存期。包含内置命名的命名空间在 Python 解释器启动时创建,会一直保留,不被删除。模块的全局命名空间在模块定义被读入时创建,通常,模块命名空间也会一直保存到解释器退出。由解释器在最高层调用执行的语句,不管它是从脚本文件中读入还是来自交互式输入,都是 __main__ 模块的一部分,所以它们也拥有自己的命名空间(内置命名也同样被包含在一个模块中,它被称作 builtins )。
当调用函数时,就会为它创建一个局部命名空间,并且在函数返回或抛出一个并没有在函数内部处理的异常时被删除。(实际上,用遗忘来形容到底发生了什么更为贴切。)当然,每个递归调用都有自己的局部命名空间。
作用域 就是一个 Python 程序可以直接访问命名空间的正文区域。这里的直接访问意思是一个对名称的错误引用会尝试在命名空间内查找。尽管作用域是静态定义,在使用时他们都是动态的。每次执行时,至少有三个命名空间可以直接访问的作用域嵌套在一起:

Ⅵ python中函数变量作用域和类变量作用域怎么搞都错,烦躁中

python中,变量的作用域要弄清楚。只有mole、class、def、lambda才会引入作用域,其他的代码块是不会引入作用域的。
1
图一中,你在函数中声明了d为全局变量,但这样是无效的,程序运行结果,已经说明这一点。

global这个关键字,是用来“在函数中修改全局变量值”的声明,而不是“在局部函数中定义一个全局变量”的声明。这里要注意一下。
你可以再局部函数外面声明变量d,再加上你原先的函数,就可以修改、访问这个变量了。

2
在类中函数的变量,作用域只在函数中。图二中,jian这个变量分别在yu(),yu1()两个函数中,是处于不同的定义域中的,是不能相互访问的。
所以,在各自函数中,只有先定义了jian变量,才能再使用。
如果想在yu1()中访问yu()中的jian变量,就需要将jian变量变成全局变量,即在class中定义一个全局变量jian,这样yu1(),yu()函数都可以访问了

Ⅶ Python涓浣跨敤镄勫彉閲忥纴鍏朵綔鐢ㄥ烟链夊摢浜涳纻璇风亩鍗曡存槑鍏跺悇镊镄勪綔鐢ㄨ寖锲淬

鍙橀噺镄勪綔鐢ㄥ烟链夊眬閮ㄤ綔鐢ㄥ烟锛圠ocal锛夈侀棴鍖呭嚱鏁帮纸Enclosing锛夈佸叏灞浣灭敤锘燂纸Global锛夈佸唴缃浣灭敤锘燂纸Built-in锛夊洓绉嶃备娇鐢ㄦ椂锛屾寜镦 L銆丒銆丢銆丅镄勯‘搴忔煡镓撅纴鍗冲湪灞閮ㄦ垒涓嶅埌锛屽垯铡诲眬閮ㄥ栫殑灞閮ㄦ垒锛堜緥濡傞棴鍖咃级锛屽傛灉鍐嶆垒涓嶅埌灏变细铡诲叏灞镓撅纴鍐嶈呭幓鍐呯疆涓镓俱

阅读全文

与python类作用域相关的资料

热点内容
润月出生命宫的正确算法 浏览:701
服务器怎么识别垃圾流量 浏览:175
欧美勾引别人老婆电影 浏览:456
非凡机器人编程中心郴州 浏览:453
aes加密传输后台解密 浏览:498
基2算法和直接算法 浏览:338
曙光ai服务器怎么样 浏览:470
单片机自激 浏览:300
好看的电影你应该懂得 浏览:781
电子制冷压缩制冷哪个好 浏览:183
成人网电影 浏览:892
泛型编程pdf 浏览:697
影片在线免费观看 浏览:684
网飞电影入口 浏览:198
亿赛通加密软件下载 浏览:933
安卓储物柜怎么取出货物 浏览:906
文件夹中怎样查找相似照片 浏览:969
linux中断线程 浏览:568
古装三极古装剧有哪些 浏览:462
智能控制技术pdf 浏览:225