首页  >  问答  >  正文

python小白问题 关于局部变量和全局变量

第一段代码:

# -*- coding:gb2312 -*-
nums = [11,22,33,44,55]

def nums_chang():
    nums = [11,22,33,44,55,999]
    print(nums)

nums_chang() # 打印出来是[11,22,33,44,55,999]
print(nums)  # 打印出来是[11,22,33,44,55]

运行结果:

第二段代码:

# -*- coding:gb2312 -*-
nums = [11,22,33,44,55]

def nums_chang():
    nums.append(999)  # 打印出来是[11,22,33,44,55,999]
    print(nums)       # 打印出来是[11,22,33,44,55,999]

nums_chang()
print(nums)

运行结果:

我的问题是:
为什么第一段代码打印出来两个结果是不一样的,而第二段代码打印出来的结果是一样的? 特别是第二段代码,为什么函数里面的append命令,可以修改外面的全局变量。而第一段代码当中,重新定义一次列表,却无法修改外面的全局变量? 这里的原因是什么?

学习ing学习ing2686 天前1067

全部回复(3)我来回复

  • 仅有的幸福

    仅有的幸福2017-06-12 09:26:56

    看了下采纳答案,我觉得还是没说到点子上面。
    首先nums变量被定义为了全局变量,也就说在这个".py"文件里面,所有类、函数都可以使用它。但是所有变量也是一个对象,而对象分为可变和不可变。而列表是可变对象,也就是说可以变更。那么什么是可变对象?就是那些可以对对象操作,而不影响在内存中的生灭。入x="234",如果你再赋值,x="111"。其实两个x已经是两个对象了,只是覆盖了而已,即x = x + "123",x也是一个新对象。

    如果是列表,x = [1,2,3],现在对它操作,x.remove(1),那么x对象还是x对象,只是对象的值有改变

    第一段代码:就是重新赋值,在不同的作用域,nums赋值了一遍,这样全局变量nums和nums_chang函数里面的nums变量就不再是一个对象,他们是不同的,因此你打印的时候出现了不同的值,此时nums_chang函数里面的nums变量已经是一个局部变量,只给这个函数使用

    第二段代码:nums是个列表,是可变对象,因此对列表的操作,不影响这个对象,因此这个对象还是全局中的那个,函数和外面都是用的全局变量,因此你修改了之后,全局变量的值也跟着修改了

    回复
    0
  • 天蓬老师

    天蓬老师2017-06-12 09:26:56

    第一: 关于作用域的问题, 可以先参考下我的一篇文章: Python: 作用域(scope) 和 LEGB, 可以先对变量的查找有个基本的认识,然后我们能够看到, 因为有赋值语句, 所以nums只会只会从局部作用域查找,并不会和全局作用域有关系

    第二: 在第一的基础上, 我们可以看到nums.append(999)中的nums是从全局作用域找到的, 又因为用的是append方法, 这方法是直接用于源列表本身, 所以你看到全局的nums也被更新了

    回复
    0
  • 扔个三星炸死你

    扔个三星炸死你2017-06-12 09:26:56

    函数在自己的作用域找不到变量,就回去上一级作用域找,你的第二个就是这样来的。
    第一个的话,和明显你赋值了呀

    回复
    0
  • 取消回复