深入理解Python变量与常量


Posted in Python onJune 02, 2016

变量是计算机内存中的一块区域,变量可以存储规定范围内的值,而且值可以改变。基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中。常量是一块只读的内存区域,常量一旦被初始化就不能被改变。

变量命名字母、数字、下划线组成,不能以数字开头,前文有说不在赘述。

变量赋值

Python中的变量不需要声明,变量的赋值操作即是变量的声明和定义的过程。每个变量在内存中创建都包括变量的标识、名称、和数据这些信息。

深入理解Python变量与常量

 Python中一次新的赋值,将创建一个新的变量。即使变量的名称相同,变量的标识并不同。

x = 1 #变量赋值定义一个变量x
print(id(x)) #打印变量x的标识
print(x+5) #使用变量
print("=========华丽的分割线=========")
x = 2 #量赋值定义一个变量x
print(id(x)) #此时的变量x已经是一个新的变量
print(x+5) #名称相同,但是使用的是新的变量x

继续赋值

x = 'hello python'
print(id(x))
print(x)

 此时x又将成为一个新的变量,而且变量类型也由于所赋值的数据类型改变而改变。

此处,id()为Python的内置函数。参见:https://docs.python.org/3/library/functions.html#id

如果变量没有赋值,Python将认为该变量不存在。

深入理解Python变量与常量

Python支持多个变量同时赋值。

例如:

a = (1,2,3) #定义一个序列
x,y,z = a  #把序列的值分别赋x、y、z
print("a : %d, b: %d, z:%d"%(x,y,z)) #打印结果
a, b, c = 1, 2, "john"

变量作用域

局部变量是只能在函数或者代码块内使用的变量,函数或者代码块一旦结束,局部变量的生命周期也将结束。局部变量的作用范围只有在局部变量被创建的函数内有效。

例如:在文件1中的fun()中定义了一个局部变量,则该局部变量只能被fun()访问,文件1中定义的fun2()不能访问,也不能被文件2访问。

#fileName:file1
def fun():
  local_var = 100 #定义一个局部变量
  print(local_var)
def fun2():
  zero = local_var - 100 #fun2中使用局部变量(不可以)
  print("get zero : %d"%zero)
fun()
#fun2()
print("local_var -1 = %d"%(local_var - 1)) #文件1中使用局部变量(不可以)
################################
#Traceback (most recent call last):
# File "E:/python/file1.py", line 10, in <module>
#  print("local_var -1 = %d"%(local_var - 1))
#NameError: name 'local_var' is not defined
################################
#Traceback (most recent call last):
# File "E:/python/file1.py", line 9, in <module>
#  fun2()
# File "E:/lichenli/python/file1.py", line 6, in fun2
#  zero = local_var - 100
#NameError: name 'local_var' is not defined
################################
#fileName:file2
import file1
file1.fun()
print(local_var)
########################
#运行结果
#100
#Traceback (most recent call last):
# File "E:\python\file2.py", line 4, in <module>
#  print(local_var)
#NameError: name 'local_var' is not defined
########################

深入理解Python变量与常量

fun()中定义的局部变量就只有fun能够访问。

全局变量是能够被不同函数、类或文件共享的变量,在函数之外定义的变量都叫做全局变量。全局变量可以被文件内任何函数和外部文件访问。

#fileName:file1
g_num1 = 1 #定义全局变量
g_num2 = 2 #定义全局变量
def add_num():
  global g_num1 #引用全局变量
  g_num1 = 3 #修改全局变量的值
  result = g_num1 + 1
  print("result : %d"%result)
def sub_num():
  global g_num2
  g_num2 = 5
  result = g_num2 - 3
  print("result : %d"%result)
add_num()
sub_num()
print("g_num1:%d "%g_num1)
print("g_num2:%d "%g_num2)
#result : 4 result为局部变量
#result : 2
#g_num1:3 全局变量g_num1在执行add_num()函数时被改变
#g_num2:5 全局变量g_num2在执行sub_num()函数时被改变

global保留字用于引用全局变量,如果不适用global关键字,在函数中再为g_num1赋值时将被解释为定义了一个局部变量g_num1。

#添加到sub_num()函数定义之后,add_num()函数调用之前
def other(): 
  result = g_num1 + 2 #直接适用全局变量不改变全局变量的值OK
  print("result : %d"%result)
other()

#######################
#result : 3
#result : 4
#result : 2
#g_num1:3 
#g_num2:5 
#######################
#添加到sub_num()函数定义之后,add_num()函数调用之前
def other():
  g_num1 = 10
  result = g_num1 + 2
  print("result : %d"%result)
other()
####################
#result : 12
#result : 4
#result : 2
#g_num1:3 
#g_num2:5 
####################

在文件2中访问全局变量。

#fileName:file2
import file1
file1.add_num() #g_num1被改变
test = file1.g_num1 + 1
print("test :%d"%test)

应该尽量避免使用全局变量。不同的模块可以自由的访问全局变量,可能会导致全局变量的不可预知性。

全局变量降低了函数或者模块之间的通用性,不同的函数或模块都要依赖于全局变量。同样,全局变量降低了代码的可读性,阅读者可能不知道调用的某个变量是全局变量。

常量

常量是一旦初始化之后就不能修改的固定值。例如:数字"5",字符串"abc"都是常量。

Python中并没有提供定义常量的保留字。Python是一门功能强大的语言,可以自己定义一个常量类来实现常量的功能。

#fileName:const.py
class _const:
  class ConstError(TypeError):pass
  def __setattr__(self,name,value):
    #if self.__dict__.has_key(name): 3.x之后has_key被废弃
    if name in self.__dict__:
      raise self.ConstError("Can't rebind const(%s)"%name)
    self.__dict__[name] = value
import sys
sys.modules[__name__] = _const()
#fileName:const_2.py
import const
const.name='zhangsan'
const.name='lisi'

##################################
#Traceback (most recent call last):
# File "E:/python/const_2.py", line 4, in <module>
#  const.name='lisi'
# File "E:/python\const.py", line 7, in __setattr__
#  raise self.ConstError("Can't rebind const(%s)"%name)
#const._const.ConstError: Can't rebind const(name)
##################################

name这个变量已经被赋值"zhangsan"不能继续被赋值,所以抛出异常。raise保留字用于抛出异常。

以上这篇深入理解Python变量与常量就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
用Python遍历C盘dll文件的方法
May 06 Python
Python获取当前函数名称方法实例分享
Jan 18 Python
对python中的xlsxwriter库简单分析
May 04 Python
Python实现字典(dict)的迭代操作示例
Jun 05 Python
Python查找数组中数值和下标相等的元素示例【二分查找】
Feb 13 Python
python的set处理二维数组转一维数组的方法示例
May 31 Python
Django使用Channels实现WebSocket的方法
Jul 28 Python
Python 读取用户指令和格式化打印实现解析
Sep 02 Python
使用Puppeteer爬取微信文章的实现
Feb 11 Python
Iconfont(矢量图标)+iconmoon(图标svg互转)配合javascript实现社交分享系统
Apr 21 Python
Python基于network模块制作电影人物关系图
Jun 19 Python
基于pytorch中的Sequential用法说明
Jun 24 Python
Python中的Descriptor描述符学习教程
Jun 02 #Python
从源码解析Python的Flask框架中request对象的用法
Jun 02 #Python
Python搭建APNS苹果推送通知推送服务的相关模块使用指南
Jun 02 #Python
Python的Django框架中使用SQLAlchemy操作数据库的教程
Jun 02 #Python
实例解析Python中的__new__特殊方法
Jun 02 #Python
详解Python中的__new__、__init__、__call__三个特殊方法
Jun 02 #Python
Python实现优先级队列结构的方法详解
Jun 02 #Python
You might like
PHP chmod 函数与批量修改文件目录权限
2010/05/10 PHP
php简单定时执行任务的实现方法
2015/02/23 PHP
yii2使用gridView实现下拉列表筛选数据
2017/04/10 PHP
jquery api参考 visualjquery 中国线路 速度快
2007/11/30 Javascript
jQuery 1.2.x 升? 1.3.x 注意事项
2009/05/06 Javascript
js或css文件后面跟参数的原因说明
2010/01/09 Javascript
从零学JS之你需要了解的几本书
2014/05/19 Javascript
JavaScript对象学习小结
2015/09/02 Javascript
jQuery满屏焦点图左右滚动特效代码分享
2015/09/07 Javascript
javascript获取系统当前时间的方法
2015/11/19 Javascript
原生Javascript插件开发实践
2017/01/09 Javascript
BootStrapValidator初使用教程详解
2017/02/10 Javascript
如何写好你的JavaScript【推荐】
2017/03/02 Javascript
关于javascript获取内联样式与嵌入式样式的实例
2017/06/01 Javascript
利用vueJs实现图片轮播实例代码
2017/06/03 Javascript
Vue2.0 slot分发内容与props验证的方法
2017/12/12 Javascript
vue之浏览器存储方法封装实例
2018/03/15 Javascript
基于Vue2x的图片预览插件的示例代码
2018/05/14 Javascript
js中apply()和call()的区别与用法实例分析
2018/08/14 Javascript
在vue中实现点击选择框阻止弹出层消失的方法
2018/09/15 Javascript
移动端手指操控左右滑动的菜单
2019/09/08 Javascript
解决vue 表格table列求和的问题
2019/11/06 Javascript
Nuxt 项目性能优化调研分析
2020/11/07 Javascript
python集合用法实例分析
2015/05/30 Python
python3将视频流保存为本地视频文件
2018/06/20 Python
基于python框架Scrapy爬取自己的博客内容过程详解
2019/08/05 Python
Python netmiko模块的使用
2020/02/14 Python
Python关键字及可变参数*args,**kw原理解析
2020/04/04 Python
pycharm2020.2 配置使用的方法详解
2020/09/16 Python
ProBikeKit美国官网:自行车套件,跑步和铁人三项套件
2016/10/13 全球购物
几道Java和数据库的面试题
2013/05/30 面试题
党员四风问题个人对照检查材料
2014/10/26 职场文书
影视后期实训报告
2014/11/05 职场文书
2014年语文教研组工作总结
2014/12/06 职场文书
检讨书怎么写
2015/05/07 职场文书
八年级作文之感恩
2019/11/22 职场文书