深入理解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支持多个变量同时赋值。

例如:

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
########################

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变量与常量就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Python中实现常量(Const)功能

    python语言本身没有提供const,但实际开发中经常会遇到需要使用const的情形,由于语言本身没有这种支出,因此需要使用一些技巧来实现这一功能 定义const类如下 复制代码 代码如下: import sys class Const(object):     class ConstError(TypeException): pass     def __setattr__(self, key, value):         if self.__dict__.has_key(key):  

  • 深入理解Python中的内置常量

    前言 大家都知道Python内置的常量不多,只有6个,分别是True.False.None.NotImplemented.Ellipsis.__debug__.下面就来看看详细的介绍: 一. True 1. True是bool类型用来表示真值的常量. >>> True True >>> type(True) <class 'bool'> 2. 对常量True进行任何赋值操作都会抛出语法错误. >>> True = 1 SyntaxError

  • Python内置的字符串处理函数整理

    str='python String function' 生成字符串变量str='python String function' 字符串长度获取:len(str)例:print '%s length=%d' % (str,len(str)) 字母处理全部大写:str.upper()全部小写:str.lower()大小写互换:str.swapcase()首字母大写,其余小写:str.capitalize()首字母大写:str.title()print '%s lower=%s' % (str,st

  • Python常用内置函数总结

    一.数学相关 1.绝对值:abs(-1) 2.最大最小值:max([1,2,3]).min([1,2,3]) 3.序列长度:len('abc').len([1,2,3]).len((1,2,3)) 4.取模:divmod(5,2)//(2,1) 5.乘方:pow(2,3,4)//2**3/4 6.浮点数:round(1)//1.0 二.功能相关 1.函数是否可调用:callable(funcname),注意,funcname变量要定义过 2.类型判断:isinstance(x,list/int)

  • Python内置函数的用法实例教程

    本文简单的分析了Python中常用的内置函数的用法,分享给大家供大家参考之用.具体分析如下: 一般来说,在Python中内置了很多有用的函数,我们可以直接调用. 而要调用一个函数,就需要知道函数的名称和参数,比如求绝对值的函数abs,只有一个参数.可以直接从Python的官方网站查看文档:http://docs.python.org/2/library/functions.html#abs 也可以在交互式命令行通过help(abs)查看abs函数的帮助信息. 调用abs函数: >>> a

  • 深入理解Python变量与常量

    变量是计算机内存中的一块区域,变量可以存储规定范围内的值,而且值可以改变.基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中.常量是一块只读的内存区域,常量一旦被初始化就不能被改变. 变量命名字母.数字.下划线组成,不能以数字开头,前文有说不在赘述. 变量赋值 Python中的变量不需要声明,变量的赋值操作即是变量的声明和定义的过程.每个变量在内存中创建都包括变量的标识.名称.和数据这些信息. Python中一次新的赋值,将创建一个新的变量.即使变量的名称相同,变量的标识

  • 深入理解Python变量的数据类型和存储

      我们知道,python的变量是有类型的,对于python变量的几种数据类型,我们在写python时是必须要有一定的概念的.知道数据类型就要知道变量数据类型怎么存储,可是为什么python的变量不需要声明数据类型就可以直接赋值?变量如果有数据类型,那变量不是可以为任意数据类型?那真正的数据类型如int在内存存储的字节大小应该为多少?等等诸如一系列的问题让我提起了的兴趣,经过网上不断查找学习后,在此将我所了解到的内容在此做个总结归纳 一.变量的数据类型 1.什么是变量的数据类型   我们先捋一捋

  • Python中的变量与常量

    目录 一.变量.常量的区别 二.变量 1. Python中的变量不需要声明类型 2. 用"="号来给变量赋值 3. 赋值 4. 变量 5. "=" 6. Python允许同时为多个变量赋值 三.常量 四.总结 一.变量.常量的区别 变量:在程序运行过程中,值会发生变化的量. 常量:在程序运行过程中,值不会发生变化的量. 无论是变量还是常量,在创建时都会在内存中开辟一块空间,用于保存它的值. 二.变量 1. Python中的变量不需要声明类型 这是根据Python的动

  • python中的常量和变量代码详解

    局部和全局变量: # name='lhf' # def change_name(): # # global name # name='帅了一比' # print('change_name',name) # # # change_name() # print(name) # name='lhf' # # def change_name(): # name1='帅了一比' # name2='帅了一比' # name3='帅了一比' # print('change_name',name) # # ch

  • 如何理解Python中的变量

    变量 在Python中,存储一个数据,需要定义一个变量 number1 = 1 #numbe1就是一个变量,用来保存数据:1 number2 = 2 #number2也是一个变量,用来保存数据:2 sum = number1+number2 #sum也是一个变量,用力保存1+2的值 说明: 所谓变量:就是可以改变的量. 程序就是用来处理数据的,而变量就是用来存储数据的 python中的变量不需要指明类型,系统会自动识别 内容扩展: 变量命名 1.下划线或大小写字母开头,后面可跟下划线.大小写字母

  • 如何理解C++ 临时变量的常量性

    1.认识临时变量的常量性 关于临时变量的常量性,先看一段代码. void print(string& str) { cout<<str<<endl; } //如此调用会报编译错误 print("hello world"); 在Linux环境使用g++编译,会出现: invalid initialization of non-const reference of type 'std::string&' from a temporary of typ

  • 浅谈对Python变量的一些认识理解

    一.Python变量 在大多数语言中,为一个值起一个名字时,把这种行为称为"给变量赋值"或"把值存储在变量中".不过,Python与许多其它计算机语言的有所不同,它并不是把值存储在变量中,而像是把名字"贴"在值的上边(专业一点说法是将名字绑定了对象).所以,有些Python程序员会说Python没有变量,只有名字,通过名字找到它代表的值. Python中的变量,与其它开发语言(如C语言)的不同: 在C语言中,变量类似于一个"容器&quo

  • 深入理解Swift中的变量与常量

    前言 最近在学习Swift这门新语言,对于熟练掌握OC编程的iOS开发者来说其实很容易上手,但Swift的确在语法和编程习惯上改变了很多,对于从未了解OC语言而从Swift开始学习iOS开发的新手来说可能上手有一定难度,下面我将这段时间的学习成果结合在网上搜索的知识做一个简单的汇总,希望可以帮助到正在学习Swift的小伙伴们. 变量和常量的定义 Swift开发文档中是这样定义变量和常量的:常量和变量把名字和一个特定类型的值关联起来.常量的值一旦设置好便不能再被更改,然而变量可以在将来被设置为不同

  • Python变量作用域LEGB用法解析

    这篇文章主要介绍了Python变量作用域LEGB用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 闭包就是, 函数内部嵌套函数. 而 装饰器只是闭包的特殊场景而已, 特殊在如果外函数的参数是指向一个, 用来被装饰的函数地址时(不一定是地址哈, 随意就好) , 就有了 "@xxx" 这样的写法, 还是蛮有意思的. 装饰器的作用是 在不改变原函数的代码前提下, 额外给原函数填写新功能. 写法上来看, 还是比较简洁优雅的. 装饰器的通

  • 详解Python变量与注释高级用法

    目录 Python变量与注释高级用法 1.概述 2.变量 2.1.变量解包 2.2.给变量注明类型 2.3.变量命名原则 3.注释 3.1.注释类型 3.2.错误使用注释案例 Python变量与注释高级用法 1.概述 好的变量和注释并非为计算机而写,而是为每个阅读代码的人而写.变量与注释是表达作者思想的基础,他们对代码质量的贡献母庸质疑. 2.变量 2.1.变量解包 1.什么是变量解包 把一个可迭代对象的所有成员,一次性的赋值给多个变量的过程就是变量解包. 2.变量解包语法 # 变量解包 use

随机推荐