深入理解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中的异常处理
Apr 28 Python
使用Python编写基于DHT协议的BT资源爬虫
Mar 19 Python
Python 查看文件的读写权限方法
Jan 23 Python
Python实现登陆文件验证方法
Oct 06 Python
Pythony运维入门之Socket网络编程详解
Apr 15 Python
如何使用Python实现自动化水军评论
Jun 26 Python
Python中的类与类型示例详解
Jul 10 Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
Nov 25 Python
Python求两个字符串最长公共子序列代码实例
Mar 05 Python
python os模块在系统管理中的应用
Jun 22 Python
python与idea的集成的实现
Nov 20 Python
Python paramiko使用方法代码汇总
Nov 20 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/05/04 PHP
yii2.0实现验证用户名与邮箱功能
2015/12/22 PHP
实例讲解php数据访问
2016/05/09 PHP
JQuery 图片延迟加载并等比缩放插件
2009/11/09 Javascript
javascript 获取元素位置的快速方法 getBoundingClientRect()
2009/11/26 Javascript
JS中Iframe之间传值及子页面与父页面应用
2013/03/11 Javascript
使用PHP+JQuery+Ajax分页的实现
2013/04/23 Javascript
php跨域调用json的例子
2013/11/13 Javascript
通过JS来动态的修改url,实现对url的增删查改
2014/09/01 Javascript
js简单的点击返回顶部效果实现方法
2015/04/10 Javascript
轻松学习Javascript闭包函数
2015/12/15 Javascript
Jquery easyui开启行编辑模式增删改操作
2016/01/14 Javascript
JS实现的找零张数最小问题示例
2017/11/28 Javascript
node.js调用C++函数的方法示例
2018/09/21 Javascript
JavaScript 性能提升之路(推荐)
2019/04/10 Javascript
Vue3.0结合bootstrap创建多页面应用
2019/05/28 Javascript
使用 js 简单的实现 bind、call 、aplly代码实例
2019/09/07 Javascript
[07:38]2014DOTA2国际邀请赛 Newbee顺利挺进胜者组赛后专访
2014/07/15 DOTA
python文件名和文件路径操作实例
2017/09/29 Python
Python numpy生成矩阵、串联矩阵代码分享
2017/12/04 Python
解决Python计算矩阵乘向量,矩阵乘实数的一些小错误
2019/08/26 Python
详解HTML5 录音的踩坑之旅
2017/12/26 HTML / CSS
Wiggle美国:英国骑行、跑步、游泳、铁人三项商店
2018/10/27 全球购物
抽象类和接口的区别
2012/09/19 面试题
专科应届生求职信
2013/11/24 职场文书
ktv收银员岗位职责
2013/12/16 职场文书
加拿大探亲邀请信
2014/01/28 职场文书
2014年母亲节寄语
2014/05/07 职场文书
会计个人实习计划书
2014/08/15 职场文书
关于对大人不礼貌的检讨书
2014/09/29 职场文书
工程合作意向书范本
2015/05/09 职场文书
创业计划书之酒厂
2019/10/14 职场文书
盘点2020年适合农村地区创业的项目
2019/10/16 职场文书
不负正版帝国之名 《重返帝国》引领SLG手游制作新的标杆
2022/04/07 其他游戏
一文解答什么是MySQL的回表
2022/08/05 MySQL
戴尔Win11系统no bootable devices found解决教程
2022/09/23 数码科技