无效性解释(第一个例子)
- 开始前明确一点,在函数内部,任意变量都是默认分配到本地命名空间中的。
- 只有使用了global才会变成全局变量
- 如果不是全局变量的化,在函数里面操作的变量都是新的变量,在函数运行之后,所有的操作在理论上是”无效的“。加引号的原因 后面会解释
”无效性“测试
代码
str = 'global' print("函数外面的str(执行函数前)",id(str)) def func1(): str = 'local' print("函数里面的创建的str",id(str)) print("函数里面的str",str) func1() print("函数外面的str(执行函数后)",id(str)) print("函数外面的str",str)
运行结果
引用global之后
str = 'global' print("函数外面的str(执行函数前)",id(str)) def func1(): global str str = 'local' #会改变 因为str指向了新的对象 而且在函数运行后不会被删除 print("函数里面的创建的str",id(str)) print("函数里面的str",str) func1() print("函数外面的str(执行函数后)",id(str)) print("函数外面的str",str)
运行结果
无效性加引号的原因(第二个例子)
- 解释’无效性‘加引号的原因,也是奇怪之处 看这段代码
c = [] def func(): for i in range(5): c.append(i) print("函数里面的",c) func() print ("操作后的c",c)
- 按照之前的逻辑来说,输出的应该是 [] ,但结果不是
让我们加上地址看一看为什么会出现这样的现象
c = [] print('没有被函数操作前的c',id(c)) def func(): for i in range(5): c.append(i) print("操作的c",id(c)) print("函数里面的",c) func() print ("操作后的c",id(c)) print ("操作后的c",c)
- 根据id 很明显都是对同一个对象进行操作的 因此会“无效性”才会加引号
产生这样的原因
python 中对变量进行赋值的时候,是通过创建一个指向等号右边对象的引用。在第二个例子中,a并没有指向新的对象,而是直接对函数外的对象进行操作了,地址没有变,因此会保留。在第一个例子中是指向了新的对象(有了新地址),当函数运行完成之后,这个新的新变量(同名不同地址)就会被系统回收,加上global之后就不会被回收了。