深入理解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的内置函数。

如果变量没有赋值,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

#  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

#  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

#  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

#  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变量与常量的更多相关文章

  1. python变量与常量内容:

    ''' python变量与常量内容: ''' # 变量:定义世间万物变化的状态 ''' height 180 weight 140 age 18 tree_name yuyang ''' # prin ...

  2. 每天学一点——python变量、常量与数字类型

    python变量.常量与数字类型 常量 (一句话能概括先讲它) 严格来讲,python中除了π与N就没有不变的量 所以,在python中我们识别常量是看它是否全大写(如下图) 变量 变量,顾名思义,就 ...

  3. Python变量,常量,注释

    变量: 由数字字母下划线任意组合,且不能以数字开头. 具有可描述性 不能用Python中的关键字 不要用中文,不要用拼音 常量: python中没有常量,但约定俗成,不可更改的,全部是大写字母命名. ...

  4. 运行第一个python程序,python 变量,常量,注释

    一.运行第一个python程序: print('Hello,world') 保存为.py文件 在cmd窗口: python3x:python  py文件路径 回车 python2x:python  p ...

  5. Python变量与常量

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

  6. Python变量和常量

    1.什么是变量 变量:核心在于变和量儿字,变->变化,量->状态如何定义? x=1 变量名 变量赋值符号:= 变量值:1 其中变量名又称为标识符: 1. 可以是字母,数字,下划线的任意组合 ...

  7. Python变量、常量、数据类型

    1. 变量 变量是一种使用方便的占位符,用于引用计算机内存地址,该地址可以存储Script运行时可更改的程序信息.例如,可以创建一个名为ClickCount的变量来存储用户单击Web页面上某个对象的次 ...

  8. 三.Python变量,常量,注释

    1. 运行python代码. 在d盘下创建一个t1.py文件内容是: print('hello world') 打开windows命令行输入cmd,确定后 写入代码python d:t1.py 您已经 ...

  9. Python 变量和常量及数据类型

    一.变量的命名 变量由字母.数字和下划线组成.变量的第1个字符必须是字母或下划线. 二.变量的赋值 例: x = 1 三.局部变量 局部变量只能在函数或者代码段内使用. 四.全局变量 在函数之外定义的 ...

随机推荐

  1. jmeter压测学习2-linux运行jmeter环境

    前言 使用jmeter做压测的时候,在windows上不太稳定,所有一直在linux服务器上使用jmeter做压力测试. 本篇记录下linux上搭建jmeter环境,以及运行jmeter脚本,查看报告 ...

  2. 初识Java(Java数字处理类-大数字运算)

    一.大数字运算 在 Java 中提供了大数字的操作类,即 java.math.BigInteger 类与  java.math.BigDecimal 类.这两个类用于高精度计算,体重 BigInteg ...

  3. 项目Beta冲刺(团队) --3/7

    课程名称:软件工程1916|W(福州大学) 作业要求:项目Beta冲刺 团队名称:葫芦娃队 作业目标:进行新一轮的项目冲刺,尽力完成并完善项目 团队博客 队员学号 队员昵称 博客地址 04160242 ...

  4. 牛客挑战赛32 E. 树上逆序对

    对于一对 $(x, y)$,能成为逆序对的取决于绝对值大的那个数的符号.假如 $a[x] > a[y]$,当 $a[x]$ 为正时,不管 $a[y]$ 取不取负号都比 $a[x]$ 小.当 $a ...

  5. docker 空间清理

    https://blog.csdn.net/qq_28001193/article/details/79555177 清理之后,重要的是找到原因,如上连接所示,其中一个占空间比较大的是日志文件,除了考 ...

  6. AlexNet梳理

    创新点 成功的使用relu函数替代了sigmoid函数,解决了使用sigmoid的梯度消散问题 成功的在全连接层使用dropout 成功的使用重叠最大池化 提出了LRN 利用GPU进行运算 数据增强2 ...

  7. BZOJ 4903: [Ctsc2017]吉夫特 数论+dp

    思路很巧妙的一道题 ~ 这个应该不完全是正解,复杂度约为 $O(3\times 10^8)$,有时间再研究研究正解. 首先,最裸的暴力是按照权值从小到大枚举每一个数,然后枚举后面的数来更新方案数,是 ...

  8. pipelinewise 基于singer 指南的的数据pipeline 工具

    pipelinewise 是基于开源singer 指南开发的数据pipeline工具,与singer tap 以及target 兼容 支持的特性 内置的elt 特性 轻量级 支持多种复制方法,cdc( ...

  9. openjudge1.1

    目录 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8 1.1.9 1.1.10 1.1.1 描述 对于大部分编程语言来说,编写一个能够输出"H ...

  10. 第03组 Alpha冲刺

    队名:不等式方程组 组长博客 作业博客 团队项目进度 组员一:张逸杰(组长) 过去两天完成的任务: 文字/口头描述: 制定了初步的项目计划,并开始学习一些推荐.搜索类算法 GitHub签入纪录: 暂无 ...