您身边的网站建设专家
成功案例

【建站服务】广元设计网页公司-域名申请

日期: 2022-09-21 05:36:48 浏览数:4


上往建站提供服务器空间服务商百度快照排名网站托管百度推广运营,致力于设计外包服务与源代码定制开发360推广搜狗推广,增加网站的能见度及访问量提升网络营销的效果,主营:网站公司,百度推广公司电话,官网搭建服务,网站服务企业排名,服务器空间,英文域名等业务,专业团队服务,效果好。


广元设计网页公司

网站建设.png

  1. 为一个从 Java 过来的人来说,Python 的作用域有点奇葩,作为开发者,只需要关注全局作用域和局部作用域就好了,全局作用域就是说白了模块(单个 .py 文件中)直接声明的变量。

    比如有个 demo.py 的文件,含有以下代码:

    var_global='global_var'#这个var_global就是全局作用域def globalFunc():
      var_local='local_var' #这个就是局部变量class demo():
      class_demo_local_var='class member' #这里也是局部变量
      def localFunc(self):
        var_locals='local_func_var'#这里也是局部变量

    以上只是说明了全局变量仅仅是在 .py 文件中直接声明的变量叫全局变量,还有在 .py 文件中直接写的逻辑代码块中,也是全局变量。也就是说在 if/elif/else/、try/except、for/while 等逻辑代码块中的变量。

    这个教程中在介绍三种命令空间的时候,说查找变量的顺序为局部的命名空间去 -> 全局命名空间 -> 内置命名空间,但是我理解的变量查找顺序为:当前域 -> 外部域(如果有) -> 全局域 -> 内置域。

    光说没有什么概念,我们来一段代码就清楚了。

    我们以 demo1.py 为例子:

    global_var='this  var  on  global space' '''
    申明global_var这个位置就是全局域,也就是教程中所说的全局作用域,
    同时它也是直接声明在文件中的,而不是声明在函数中或者类中的变量
    '''class demo():
      class_demo_local_var='class member' 
      '''
      虽然class_demo_local_var在这里是局部变量,这个局部变量的域相对于var_locals是外部域,
      所以可以直接被var_locals所在的更小的局部域访问
      '''
      def localFunc(self):
        var_locals='local_func_var'
        '''
        这里也是局部变量,但是相对于class_demo_local_var变量,却是更小的域,
        因此class_demo_local_var所在的哪个域无法访问到当前域来
        '''
        print(self.class_demo_local_var)#到这里会查找当前域中有没有class_demo_local_var这个变量,然后再到相对于当前域的外部域去查找变量
    alibi

       alibi

      ali***jia@qq.com

    3年前 (2019-10-20)
  2.    tempo

      luo***7@iccas.ac.cn

    185

    教程中写到 Python 中变量的查找顺序:“在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再去内置中找。可以看一个具体的例子。

    Python 的一个内建值 int,我们首先将其赋值为 0,然后定义一个函数 fun1()。

    int = 0def fun1():
        int = 1
        def fun2():
            int = 2
            print(int)
        fun2()fun1()  # 输出 2

    函数 fun1() 的作用就是调用函数 fun2() 来打印 int 的值。

    输出结果为:2

    因为 local 中的 int = 2,函数将其打印出来。

    将函数 fun2() 中的 int = 2 删除:

    int = 0def fun1():
        int = 1
        def fun2():
            print(int)
        fun2()fun1()  # 输出 1

    调用函数 fun1() 输出结果为:1

    因为 local 找不到 int 的值,就去上一层 non-local 寻找,发现 int = 1 并打印。

    而进一步删除函数 fun1() 中的 int = 1:

    int = 0def fun1():
        def fun2():
            print(int)
        fun2()fun1() # 输出 0


fun1()  # 输出 1

调用函数 fun1() 输出结果为:1


因为 local 找不到 int 的值,就去上一层 non-local 寻找,发现 int = 1 并打印。


而进一步删除函数 fun1() 中的 int = 1:


int = 0

def fun1():

    def fun2():

        print(int)

    fun2()

fun1() # 输出 0

调用函数 fun1() 输出结果为:0


因为 local 和 non-local 都找不到 int 的值,便去 global 中寻找,发现 int = 0 并打印。


若删除 int = 0这一条件:


def fun1():

    def fun2():

        print(int)

    fun2()

fun1()

调用函数 fun1() 输出结果如下:


<class 'int'>

因为 local、non-local、global 中都没有 int 的值,便去 built-in 中寻找 int 的值,即:


>>> int

<class 'int'>

tempo

   tempo


  luo***7@iccas.ac.cn


3年前 (2019-12-16)

   GsxxInRnb


  993***819@qq.com


   参考地址


22

若没有使用 global 或 nonlocal 关键字对局部变量进行声明,在局部作用域中,可以访问全局命名空间中的变量,不可对其进行赋值。


对于教程中的这个实例:


a = 10

def test():

    a = a + 1

    print(a)

test()

运行后如下:(提示出错)


Traceback (most recent call last):

  File "<input>", line 5, in <module>

  File "<input>", line 3, in test

UnboundLocalError: local variable 'a' referenced before assignment

若程序改为如下:


a = 10

def test():    

    b = a + 1    

    print(b)

test()

运行结果:(正常运行)


11

在函数 test() 中,可以读取全局命名空间中的 “a”,对应语句 “b=a+1”。


即在局部作用域中,可以访问全局命名空间中的变量。


若程序改为如下:


a = 10

def test():    

    b = a + 1    

    a=b    

    print(b)

test()

运行:(提示出错)


Traceback (most recent call last):

  File "<input>", line 6, in <module>

  File "<input>", line 3, in test

UnboundLocalError: local variable 'a' referenced before assignment

错误的原因在于语句 “a=b”,对 “a” 进行赋值是不可以的。


即在函数 test() 中,不可以直接对全局命名空间中的 “a” 进行赋值。


若程序改为如下:


a = 10

def test():

    global a

    b = a + 1    

    a=b

    print(b)

test() #输出b

print(a) #输出a

运行:(正常运行)


11

11

语句 “global a” 声明了 “a” 采用全局命名空间中的 “a”,这样便可在函数 test() 中,对全局命名空间中的 “a” 直接进行赋值了。


若没有使用 global 或 nonlocal 关键字对局部变量进行声明,在局部作用域中,可以访问全局命名空间中的变量,不可对其进行赋值。


若使用了 global 或 nonlocal 关键字对局部变量进行声明,在局部作用域中,可以访问全局命名空间中的变量,也可对其进行赋值。


故,在局部作用域中,若想使用外部命名空间中的变量,应使用 global 或 nonlocal 关键字进行声明。


GsxxInRnb

   GsxxInRnb


  993***819@qq.com


   参考地址


1年前 (2021-07-24)

   fenglu


  250***819@qq.com


22

楼上讲的结论是对的,但中间的逻辑是不对的。


a = 10

def test():    

    b = a + 1    

    a=b    

    print(b)

test()

运行后会报错:


UnboundLocalError: local variable 'a' referenced before assignment

这里说的很清楚啊,压根不是对全局变量赋值导致的错误,而是因为通过“a=b”定义了局部变量a,但是局部变量a在前一句“b=a+1”中被引用了,也就是说先使用,然后才定义的,这里的“b=a+1”中a被解析成了局部变量。


那为什么去掉“a=b”就没问题了呢?


广元设计网页公司


上往建站提供搭建网站域名注册官网备案服务网店详情页设计企业网店专业网络店铺管理运营全托管公司咨询电话,服务器空间,微信公众号托管网页美工排版,致力于域名申请竞价托管软文推广全网营销,提供标准级专业技术保障,了却后顾之忧,主营:虚拟主机网站推广百度竞价托管网站建设上网建站推广服务网络公司有哪些等业务,专业团队服务,效果好。

服务热线:400-111-6878 手机微信同号:18118153152(各城市商务人员可上门服务)


全国咨询热线:400-111-6878

地址:全国各地都有驻点商务

Copyright © 2021 通陆科技

网站建设上往建站