关于全局变量的问题
result = []def get_digits(n):
if n>0:
result.insert(0,n%10)
get_digits(n//10)
n=int(input('请输入:'))
get_digits(n)
print(result)
请问在这个函数中,result应该是全局变量,可为什么函数中没有用global进行修改却也能运行处理 本帖最后由 jackz007 于 2020-11-19 12:00 编辑
全局变量不可修改指的是不可使用 “=” 对变量进行赋值,而本例中的 result 是列表,属于可修改对象,通过对象的方法,不用赋值就可以对对象进行修改,这样的操作显然是允许的。
容器类型的数据在容器本身没发生改变时,是不会触发屏蔽机制的
也就不需要 global 进行声明,只有在容器本身发生改变时才会导致屏蔽机制的触发
即对于你这里,对 result 进行添加元素、删除元素等是不改变列表本身的内存地址的
所以可以直接在函数内进行添加元素
可以看看我写过的这个帖子:Python细节之7、global与nonlocal的使用
不想通篇看的话,可以直接看第四部分的内容
为什么在函数中使用全局变量的时候,有时候需要使用关键字 global,而有时候则不需要关键字 global 呢?
python 编程语言,尽量的避免复杂化
像 int 、 float 、 str 等类型是一类不可变类型,所谓不可变类型,就是定义即赋值,修改实际上是新的定义,这一类变量的定义和修改都是使用赋值运算符 '='。
像 list 、 set 、 dict 等类型是一类可变类型,所谓可变类型,就是定义之后,还可以对变量进行修改,修改前后,该变量的 id 不变,这一类变量定义使用赋值运算符,修改则需要下标(或键),还可以有插入、删除等操作。
对于不可变类型的变量,若是在函数内部进行修改的话,会有歧义,无法识别到底是修改同名的全局变量,还是定义一个同名的局部变量(因为修改和定义方式是一样的)。因此在函数内若使用不可变类型的全局变量时需要使用 global 进行明确指出。
对于可变类型,则不存在这种歧义,若是在函数内部修改一个与全局变量同名的变量,不会被认为是要创建一个同名的局部变量(因为修改和定义方式是不一样的),当在函数内没有定义一个与全局变量同名的局部变量,那么修改一个同名的变量时,能够明确就是修改全局变量。因此在函数内若使用一个可变类型的全局变量时不需要使用 global 明确指出。
页:
[1]