zoukankan      html  css  js  c++  java
  • python易错点

    1.全局变量

    python中对全局变量的处理有些技巧性。

    一般而言,若要在某一个函数(或者局部代码段)“访问”(或者说read)全局变量,是不需要事先声明global的

    比如下列代码

    1 a = 1
    2 
    3 def func():
    4     b = a
    5     print b
    6 
    7 if __name__ == '__main__':
    8     func()

    将输出4。func中的a为全局变量。

    如果,我们要改变全局变量,必须声明global。

    看下面的代码

    a = 1
    
    def func():
        global a
        a = 4
    
    if __name__ == '__main__':
        func()
        print a

    此时输出4。如果没有global的声明,改变的将是局部变量a,输出结果为1。

    如果a是list结构呢?

    1 a = [1, 5]
    2 
    3 def func():
    4     b = a
    5     print b
    6 
    7 if __name__ == '__main__':
    8     func()

    和前面例子一样,输出[1, 5]

    改一下

    1 a = [1, 5]
    2 
    3 def func():
    4     global a
    5     a = [2, 6]
    6 
    7 if __name__ == '__main__':
    8     func()
    9     print a

    输出[2, 6],我们更改了全局变量a。删除global声明,输出[1, 5],改变的是局部变量。

    到此为止,无论a的数据类型是什么,其表现的特性是一致的。

    下面看两个另类的例子。

    例子一

    1 a = 2
    2 
    3 def func():
    4     a = a + 3
    5 
    6 if __name__ == '__main__':
    7     func()

    这段代码会报错:Line 4: Error: local variable 'a' referenced before assignment

    很明显,a在这里被当成了局部变量,而不是全局变量。所以正确的做法是声明global a

    例子二

    1 a = [1, 4]
    2 
    3 def func():
    4     a[0] = 2
    5     a[1] = 3
    6 
    7 if __name__ == '__main__':
    8     func()
    9     print a

    这段代码我们并没有声明a为全局变量,但最后输出[2, 3]。这一点要注意。可以这样理解。这应该和python内部处理数据类型的方式有关。

    一个没有验证过的想法是,在函数func中将a看做“指针变量”,它本身的值不变,但是可以改变它指向的地址存储的值。

    而在上面的例子中func函数里包含a=[2,  6],这是一个全新的局部list对象a初始化的过程。

    这可能与list的深浅拷贝有关。具体原因我也不太清楚。待解决。但要记住上述例子所展示的这个事实。

    2.。。。。待续

  • 相关阅读:
    SVN 图标消失
    svn 图标不显示
    wamp 局域网访问
    php程序 注册机制
    ThinkphpCMF笔记
    thinkphp缓存
    wampserver与 thinkphp 安装
    js function集合
    php function集合
    php sleep
  • 原文地址:https://www.cnblogs.com/ShaneZhang/p/3089219.html
Copyright © 2011-2022 走看看