此文目的

此文主要讨论和总结一下,Python中的变量的作用域(variable scope)。

目的在于,通过代码,图解,文字描述,使得更加透彻的了解,Python中的变量的作用域;

以避免,在写代码过程中,由于概念不清晰而导致用错变量,导致代码出错和变量含义错误等现象。

如有错误,欢迎指正。

解释Python中变量的作用域

Python变量作用域的解释之代码版

所用的示例代码,主要来自于:

中的:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

#!/usr/bin/python

# -*- coding: utf-8 -*-

"""

-------------------------------------------------------------------------------

Function:

【整理】Python中:self和init__的含义 + 为何要有self和__init__

Author: Crifan

Verison: 2012-11-27

-------------------------------------------------------------------------------

"""

#注:此处全局的变量名,写成name,只是为了演示而用

#实际上,好的编程风格,应该写成gName之类的名字,以表示该变量是Global的变量

name= "whole global name";

class Person:

name= "class global name"

def __init__(self, newPersionName):

#self.name = newPersionName;

#此处,没有使用self.name

#而使得此处的name,实际上仍是局部变量name

#虽然此处赋值了,但是后面没有被利用到,属于被浪费了的局部变量name

name= newPersionName;

def sayYourName(self):

#此处,之所以没有像之前一样出现:

#AttributeError: Person instance has no attribute ‘name‘

#那是因为,虽然当前的实例self中,没有在__init__中初始化对应的name变量,实例self中没有对应的name变量

#但是由于实例所对应的类Person,有对应的name变量,所以也是可以正常执行代码的

#对应的,此处的self.name,实际上是Person.name

print ‘My name is %s‘%(self.name);# -> class global name

print ‘name within class Person is actually the global name: %s‘%(name);#-> whole global name

print "only access Person‘s name via Person.name=%s"%(Person.name);# -> class global name

def selfAndInitDemo():

persionInstance= Person("crifan");

persionInstance.sayYourName();

print "whole global name is %s"%(name);# -> whole global name

###############################################################################

if __name__=="__main__":

selfAndInitDemo();

Python变量作用域的解释之图解版

下面来图形来解释一下:

Python变量作用域的解释之文字版

再用文字简要描述就是:

全局变量(Global variable)

不论是其他普通函数中,还是Class类中,都是可以通过对应的变量名,而可以直接引用的。

局部变量(automatic variable)

对于函数内,包括类Class的函数内,普通的变量,都是自动临时变量

此处插播背景知识:

变量的优先级关系

普通局部变量和全局变量的作用域,最核心的区别在于:

内部变量的优先级大于外部变量

此处即,(函数内的)局部变量,优先级大于,(外部的)全局变量

换句话说:

A。如果函数内部,出现了和全局变量同名的变量,则说明是局部变量;

B。如果,函数内,没有同名的局部变量的情况下,对应的变量,则是全局变量。

这个变量的优先级关系,不仅针对与Python语言,几乎其他所有语言,都适用,比如C/C++/C#等等。

所以,上面示例中的__init__中的name,不是全局变量:

name = “whole global name”;

中的name而是,局部变量;

其中,此处是属于那种,Python(和,或其他特殊)语言所特有的,无需声明变量,就可以直接使用的情况。

即局部变量name,并没有声明,但是就直接拿过来使用,通过:

name = newPersionName;

在初始化,设置为对应的名字,此处即”crifan”了。

类(Class)的变量

类的变量,在类的范围内,只能通过

ClassName.PropertyName

或者说

ClassName.VariableName

去访问,当前类ClassName的变量PropertyName

例子中,就是通过

Person.name

去访问类Person中的变量name的值的。

示例(Instance)的变量

示例中的变量,理论上,是用

InstanceObject.PropertyName

去访问的。

而此处,由于Python中,默认的,约定俗成的写法,把类的函数的第一个参数的名字,定义为Instance变量,且名字叫做self,所以,就变成了:

self.PropertyName

了。

所以,上述在类的函数中,想要访问Instance的变量的话,就是通过

self.name,去访问类Person的示例self中的变量name了。

总结

所以,想要彻底了解变量的作用域;

还是要多多写代码自己测试。

并且最好具有其他不同语言的相关背景知识,以便更加方便去实现横向对比,实现融会贯通,举一反三的效果。

python函数中变量的作用域_Python中变量的作用域(variable scope)相关推荐

  1. python函数内部返回的值_Python中函数的返回值示例浅析

    前言: 前面我们介绍了简单的介绍了函数和函数的参数,今天我们来说一下Python中函数的返回值. 函数的返回值:函数运算的结果,需要进一步的操作时,给一个返回值return用来返回函数的结果,如果没有 ...

  2. python函数库分类及实例_Python中Scikit-Learn库的分类方法总览

    译者丨野生大熊猫 https://mp.weixin.qq.com/s/hmNKdM3pA3Mq9vq0TQXgOg 简介 你是一个正在进入机器学习领域的Python程序员吗? 掌握Scikit-Le ...

  3. python函数的传参要求_python中函数传参详解

    一.参数传入规则 可变参数允许传入0个或任意个参数,在函数调用时自动组装成一个tuple: 关键字参数允许传入0个或任意个参数,在函数调用时自动组装成一个dict: 1. 传入可变参数: def ca ...

  4. python函数与方法的区别_python中函数和方法有哪些区别

    python中函数和方法有哪些区别 发布时间:2020-11-16 09:30:04 来源:亿速云 阅读:89 作者:小新 小编给大家分享一下python中函数和方法有哪些区别,相信大部分人都还不怎么 ...

  5. Python基础_第3章_Python中的循环结构

    Python基础_第3章_Python中的循环结构 文章目录 Python基础_第3章_Python中的循环结构 Python中的循环结构 一.回顾分支练习题 1.判断是否为一个合法三角形 2.求世界 ...

  6. Python基础_第5章_Python中的数据序列

    Python基础_第5章_Python中的数据序列 文章目录 Python基础_第5章_Python中的数据序列 Python中的数据序列 一.字典--Python中的==查询==神器 1.为什么需要 ...

  7. python中函数的作用域_Python中的函数作用域

    在python中,一个函数就是一个作用域 name = 'xiaoyafei' def change_name(): name = '肖亚飞' print('在change_name里的name:', ...

  8. python类中变量作用域_Python中的变量作用域

    1.块级作用域 1 if 1 == 1:2 name = "lzl" 3 4 print(name) //输出lzl5 6 7 for i in range(10):8 age = ...

  9. python中函数作用域_Python中的函数作用域

    在python中,一个函数就是一个作用域 name = 'xiaoyafei' def change_name(): name = '肖亚飞' print('在change_name里的name:', ...

最新文章

  1. 【转载】MSXML应用总结 开发篇(下)
  2. 8月22-23日 首届IT管理技术大会
  3. 字符串排序 java_java字符串排序
  4. python int函数详解_Python内置函数OCT详解
  5. Hadoop HA 机制学习:HA是怎么运作,QJM又是怎么发挥功效的
  6. Python爬虫应用实战-如何对爬取的数据进行数据存储?
  7. 限制python内存上限_Python限制内存和CPU使用量的方法(Unix系统适用)
  8. 以软件推动工业进步 -嵌入式学习网站
  9. FPGA转正总结(标准版)
  10. 单因素方差分析graphpad_【SPSS】单因素方差分析(比较均值gt;单因素ANOVA)
  11. 《开源网店系统iWebShop2.0模板开发教程》的说明
  12. Java-集合第三篇List集合
  13. 水位传感器的python代码_关于水的作文
  14. 西数绿盘的“C1门”!!!
  15. 高等代数 多项式环(第7章)5* 结式与域
  16. python 自动发邮件模块抄送_Python实现自动发送邮件
  17. QT图片缩放、拖动、重置
  18. God-Mz公益版秒赞系统源码
  19. Painter X Liquid Ink(液体墨水)画笔
  20. 跨平台应用开发进阶(十五) :uni-app实现全项目字体替换

热门文章

  1. SingToken全球首款区块链智能AI音乐钱包
  2. 水晶报表基础入门——4.水晶报表排序、分组技术
  3. WPF-DataContext
  4. Aptana 添加jQuery提示
  5. 2017年3月份前端资源分享
  6. Java对象创建、分配、布局、访问小析(HotSpot虚拟机)(二)
  7. Error creating bean with name 'userServiceImpl': Injection of autowired dependencies failed
  8. ant之property关键字
  9. Golang开发环境配置
  10. F5和nginx配合转发前端请求