Python【知识点】傻傻的函数内变量

问题的由来

有个学生问我一个问题关于函数内部变量的咱们来一块儿看下代码: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。

相关文章
相关标签/搜索