Python笔记

来源:互联网 发布:ubuntu怎么安装apache 编辑:程序博客网 时间:2024/06/16 03:40

1. 生成list的不同方法及影响

a=[set()]*5a[0].add(1)print ab=[]for i in range(5):b.append(set())b[0].add(1)print bc=[1]*5c[0]=2print c<<< [set([1]), set([1]), set([1]), set([1]), set([1])]<<< [set([1]), set([]), set([]), set([]), set([])]<<< [2, 1, 1, 1, 1]

以上运行结果为 [set([1]), set([1]), set([1]), set([1]), set([1])], [set([1]), set([]), set([]), set([]), set([])],[2, 1, 1, 1, 1]。这是因为list a 中的元素a[0]~a[4]全部指向同一个地址,该地址对应一个空的set,由于set是可以改变值的类型,所以对a[0]对应的set操作就改变了a[0]~a[4]所指向的地址上那个set的值而不改变a[0]所指向的地址,所以访问a[1]~a[4]也会得到set(1)的结果。list b中的元素分别指向不同地址,所以对b[0]对应的set操作不影响b[1]~b[4]所指向的地址上的那些set,b[0]指向的地址不变,该地址上的set变为set(1)。list c中的元素均指向同一个地址,该地址对应整型数1,由于整型数不可以改变值,所以对c[0]赋值操作会改变c[0]指向的地址,c[0]新指向的地址对应整型数2,而c[1]~c[4]指向的地址不变。

2. 全局变量和局部变量

num=1def f_1():    #num=2    num1=num+1    print num    print num1    #global num    print num    #num+=4f_1()print numli=[1,2]def f_2():    # global li    # li=[5,8,7]    li[0]+=1    li[1]=6f_2()print li
全局变量在函数体内可以直接访问,但不能用赋值语句修改,如果使用了赋值语句,如 num=2 和li=[5,8,7],会在函数体内生成一个同名的局部变量,之后函数体内的访问均指向该局部变量。如果想在函数体内修改全局变量的值,可使用global num和global li 来声明之后的访问为全局变量,之后使用赋值语句不会产生局部变量而是修改全局变量。对于上面列表的例子 li 而言,如果f_2()中不声明global li,无法直接在函数体内改变 li 指向的地址,但是通过访问 li 指向的地址,可以改变 li 的元素li[0]和li[1]指向的地址,即带有li[0]和li[1]的赋值语句并不会生成局部变量,而是访问全局变量 li 指向的地址来修改li[0]和li[1]的值,相当于列表具有全局变量的属性,但列表内元素并不具备。

另外函数体的形参相当于函数体内的局部变量,如果和全局变量重名,函数体内就无法访问全局变量,此时如果函数体内使用global语句声明,python会报错:“name 'XXXX' is local and global”,说变量名XXXX在函数体内即是全局变量又是局部变量。

要避免全局变量和局部变量混用,一个好的方法是所有全局变量都用大写字母命名,这样就可以降低因混用而出现错误的可能。



0 0