深入理解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编写基于DHT协议的BT资源爬虫
Mar 19 Python
Python中struct模块对字节流/二进制流的操作教程
Jan 21 Python
开源软件包和环境管理系统Anaconda的安装使用
Sep 04 Python
Python搭建FTP服务器的方法示例
Jan 19 Python
PyQt5主窗口动态加载Widget实例代码
Feb 07 Python
pandas数值计算与排序方法
Apr 12 Python
python字符串string的内置方法实例详解
May 14 Python
python列表插入append(), extend(), insert()用法详解
Sep 14 Python
python处理excel绘制雷达图
Oct 18 Python
pycharm如何使用anaconda中的各种包(操作步骤)
Jul 31 Python
利用python Pandas实现批量拆分Excel与合并Excel
May 23 Python
pytorch中的torch.nn.Conv2d()函数图文详解
Feb 28 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实现克鲁斯卡尔算法实例解析
2014/08/22 PHP
PHP扩展开发教程(总结)
2015/11/04 PHP
为指定元素增加样式的js代码
2009/12/09 Javascript
ajax 同步请求和异步请求的差异分析
2011/07/04 Javascript
创建公共调用 jQuery Ajax 带返回值
2012/08/01 Javascript
jquery实现的树形目录实例
2015/06/26 Javascript
JavaScript中使用数组方法汇总
2016/02/16 Javascript
Bootstrap入门书籍之(零)Bootstrap简介
2016/02/17 Javascript
JQuery.validationEngine表单验证插件(推荐)
2016/12/10 Javascript
聊聊JavaScript如何实现继承及特点
2017/04/07 Javascript
vue增删改查的简单操作
2017/07/15 Javascript
js原生日历的实例(推荐)
2017/10/31 Javascript
JS实现百度网盘任意文件强制下载功能
2018/08/31 Javascript
使用angularjs.foreach时return的问题解决
2018/09/30 Javascript
angularJs自定义过滤器实现手机号信息隐藏的方法
2018/10/08 Javascript
Vue利用History记录上一页面的数据方法实例
2018/11/02 Javascript
vue-cli 2.*中导入公共less文件的方法步骤
2018/11/22 Javascript
Python 中开发pattern的string模板(template) 实例详解
2017/04/01 Python
python实现逐个读取txt字符并修改
2018/12/24 Python
Python中正则表达式的用法总结
2019/02/22 Python
使用Python实现毫秒级抢单功能
2019/06/06 Python
在python中将list分段并保存为array类型的方法
2019/07/15 Python
Python 通过截图匹配原图中的位置(opencv)实例
2019/08/27 Python
Python进程间通信 multiProcessing Queue队列实现详解
2019/09/23 Python
利用Python裁切tiff图像且读取tiff,shp文件的实例
2020/03/10 Python
将python字符串转化成长表达式的函数eval实例
2020/05/11 Python
一文轻松掌握python语言命名规范规则
2020/06/18 Python
html5中去掉input type date默认样式的方法
2018/09/06 HTML / CSS
解决H5的a标签的download属性下载service上的文件出现跨域问题
2019/07/16 HTML / CSS
毕业生自我推荐
2013/11/04 职场文书
历史专业个人求职信分享
2013/12/20 职场文书
校友会欢迎辞
2014/01/13 职场文书
大学生活动总结模板
2014/07/02 职场文书
夫妻忠诚协议范文
2014/11/16 职场文书
培训通知
2015/04/17 职场文书
彻底解决MySQL使用中文乱码的方法
2022/01/22 MySQL