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.。。。。待续

  • 相关阅读:
    POJ 3660 Cow Contest (floyd求联通关系)
    POJ 3660 Cow Contest (最短路dijkstra)
    POJ 1860 Currency Exchange (bellman-ford判负环)
    POJ 3268 Silver Cow Party (最短路dijkstra)
    POJ 1679 The Unique MST (最小生成树)
    POJ 3026 Borg Maze (最小生成树)
    HDU 4891 The Great Pan (模拟)
    HDU 4950 Monster (水题)
    URAL 2040 Palindromes and Super Abilities 2 (回文自动机)
    URAL 2037 Richness of binary words (回文子串,找规律)
  • 原文地址:https://www.cnblogs.com/ShaneZhang/p/3089219.html
Copyright © 2011-2022 走看看