本帖最后由 sunrise085 于 2020-3-22 02:24 编辑
python编程语言,尽量的避免复杂化
像int、float、str等类型是一类不可变类型,所谓不可变类型,就是定义即赋值,修改实际上是新的定义,这一类变量的定义和修改都是使用赋值运算符'='。
像list、set、dict等类型是一类可变类型,所谓可变类型,就是定义之后,还可以对变量进行修改,修改前后,该变量的id不变,这一类变量定义使用赋值运算符,修改则需要下标,还可以有插入、删除等操作。
为什么在函数中使用全局变量的时候,不可变类型需要使用关键字global,而可变类型不需要关键字global呢?
首先python中,变量有作用域的区别,有些仅仅在函数内部有效,在函数外是无效的。
对于不可变类型的变量,若是在函数内部进行修改的话,会有歧义,无法识别到底是修改同名的全局变量,还是定义一个同名的局部变量(因为修改和定义方式是一样的)。因此在函数内若使用不可变类型的全局变量时需要使用global进行明确指出。
对于可变类型,则不存在这种歧义,若是在函数内部修改一个与全局变量同名的变量,不会被认为是要创建一个同名的局部变量(因为修改和定义方式是不一样的),当在函数内没有定义一个与全局变量同名的局部变量,那么修改一个同名的变量时,能够明确就是修改全局变量。因此在函数内若使用一个可变类型的全局变量时不需要使用global明确指出。
当然,在函数中仍然可以定义一个同名的可变类型的局部变量,这要在函数内第一次使用该变量之前定义,否则就会出错。list1=['a','b','c']
def func(x):
list1[0]='f' #这里已经使用过全局变量了,在函数内就不能再定义同名的局部变量了
print('下面打算定义一个与全局变量同名的局部变量:')
list1=['s'] #这里定义同名的变量,会报错
def func2():
list1=[123,'abc'] #这里定义了一个与全局变量同名的局部变量
list1.append('123') #这里使用的也是局部变量
|