有个学生问我一个问题关于函数内部变量的咱们来一块儿看下代码:python
Code1app
1 x = 50 2 3 4 def func(): 5 print(x) 6 global x 7 print("x修改前的值:", x) 8 x = 2 9 print("x修改后的值:", x) 10 11 func() 12 13 """ 14 输出结果为: 15 50 16 x修改前的值: 50 17 x修改后的值: 2 18 """
咱们知道咱们要在函数内部修改全局变量必须使用global才能够?那咱们看下面的代码函数
Code2spa
1 test_dict = {"name": "luotianshuai", "age": 18} 2 3 4 def func(): 5 print(test_dict) 6 print("修改前:", test_dict) 7 test_dict["age"] = 16 8 print("修改后:", test_dict) 9 10 func() 11 12 """ 13 输出结果: 14 {'name': 'luotianshuai', 'age': 18} 15 修改前: {'name': 'luotianshuai', 'age': 18} 16 修改后: {'name': 'luotianshuai', 'age': 16} 17 """
额?问题来了为何不用global我就能够修改全局变量呢?code
在Code1代码中对象
1 x = 50 2 3 4 def func(): 5 x = 2 6 """ 7 x = 2 这段代码是有歧义的,由于它便可表示引用全局变量x,也能够表示建立一个局部变量 8 因此在python中,默认它的行为是建立局部变量,除非显式声明global. 9 """ 10 11 func()
在Code2代码中blog
test_dict = {"name": "luotianshuai", "age": 18} def func(): print(test_dict) print("修改前:", test_dict) test_dict["age"] = 16 """ test_dict["age"] 它是“明确的”,由于若是把d看成是局部变量的话,它会报KeyError 因此它只能是引用全局的d,故不须要画蛇添足显式声明global。 """ print("修改后:", test_dict) func()
总结:class
从上面的结果看,咱们思考能够得出一个结论,函数内部是否能够直接修改全局变量的本质就是"它是不是明确的"test
仔细想一想,就会发现不止dict不须要global,在函数内部全部”明确的“东西都不须要global。变量
由于int类型str类型之类的,只有一种修改方法,即x = y, 刚好这种修改方法同时也是建立变量的方法,因此产生了歧义,不知道是要修改仍是建立。
而dict/list/对象等,能够经过dict['x']=y或list.append()之类的来修改,跟建立变量不冲突,不产生歧义,因此都不用显式global。