zoukankan      html  css  js  c++  java
  • Python【知识点】傻傻的函数内变量

    问题的由来

    有个学生问我一个问题关于函数内部变量的我们来一起看下代码:

    Code1

     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才可以?那我们看下面的代码

    Code2

     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我就可以修改全局变量呢?

    问题解释

    在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代码中

    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()

     总结:

    从上面的结果看,我们思考可以得出一个结论,函数内部是否可以直接修改全局变量的本质就是"它是否是明确的"

    仔细想想,就会发现不止dict不需要global,在函数内部所有”明确的“东西都不需要global。

    因为int类型str类型之类的,只有一种修改方法,即x = y, 恰好这种修改方法同时也是创建变量的方法,所以产生了歧义,不知道是要修改还是创建。

    而dict/list/对象等,可以通过dict['x']=y或list.append()之类的来修改,跟创建变量不冲突,不产生歧义,所以都不用显式global。

  • 相关阅读:
    ASP.NET(C#)图片加文字、图片水印
    CMake构建Visual Studio中MFC项目的Unicode问题
    用Visual Studio 2008(VS)编译WebKit的r63513
    此时学习中
    ASP.NET进阶——初学者的提高(长期)
    继续努力
    程序员阿士顿的故事
    iOS 深拷贝和浅拷贝
    Javascript中this的取值
    Lisp的本质(The Nature of Lisp)
  • 原文地址:https://www.cnblogs.com/luotianshuai/p/6775141.html
Copyright © 2011-2022 走看看