一、变量的修改
我们都知道,在程序中根据变量的作用域的不同可以把变量分为全局变量与局部变量。在函数中的变量如果没有特别声明即使变量名与全局变量名完全一致也不会对全局的变量产生影响,如下面这个例子所示:
由于作用域的不同,在函数中不经过特殊声明是不会改变全局变量“name”的值的。要想在函数的作用域中修改全局变量,我们可以利用global关键字:
如上图所示,通过global关键字我们可以在函数这个局部作用域中修改全局变量。
二、列表的修改
对于列表,我们进行这样的操作:
(1)如下图:
同样,如果我们直接进行修改list1中的内容还是不行。只有在函数中利用global关键字声明后才能修改全局变量:
(2)但是,如果我们进行下面这样的修改:
当我们在函数中给列表后面追加一个数字6后,最终打印出来的list1里面竟然有函数中追加的结果!我们再来进行其他的操作试试:
我们竟然也能在函数这个局部作用域中进行元素的删除操作!
其实,从占内存的角度讲,列表本身的内存地址与列表中的元素的内存地址是不一样的。对于列表而言,列表本身只是一个元素的容器,它与里面的元素毫无关系。就好比箱子与货物的关系一样,货物装到箱子里是为了处理起来方便,而它与箱子本身没有任何关系。
这下大家应该清楚了,当我们试图去修改列表的时候,程序会将列表以及列表中的元素看做是一个整体“变量”,它们的处理符合全局变量与局部变量的逻辑;而我们要改变列表中具体元素的时候程序会在内存中独立为列表中的元素创建或者删除空间,与这个元素以及列表所在的作用域没有关系。
其实,对于列表、字典、集合这样的数据结构以及类、对象中的元素我们都可以在函数中修改;而对于数字、字符串这样的数据类型只有在函数中利用global关键字声明后才能对全局变量进行修改!