zoukankan      html  css  js  c++  java
  • 深入理解Python变量与常量

    深入理解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:pythonfile2.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:/pythonconst.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变量与常量就是小编分享给大家的全部内容了,希望能给大家一个参考

  • 相关阅读:
    web前端笔记1
    前端与后台交互所需技术
    js的HTML属性操作
    浮动塌陷
    前端与后端的交互(定义接口)
    AjAX(第3章 Ajax的简单例子(Ajax+PHP)
    AjAX(简单概要介绍)
    Bootstrap 学习之js插件(折叠(collapse)插件)
    Net core 项目 EF CodeFist 多重外键约束问题
    对VS 2017中ASP.NET Core项目解决:Add-Migration : 无法将“Add-Migration”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。
  • 原文地址:https://www.cnblogs.com/amengduo/p/9586220.html
Copyright © 2011-2022 走看看