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。

  • 相关阅读:
    图片和xml文件的转换
    WPF的样式(Style)继承
    .NET的序列化和反序列化
    WPF中的画板InkCanvas
    找到网页的源文件并找到歌曲文件的路径
    How to check if a ctrl + enter is pressed on a control?
    计算两个日期相差的天数
    图片保存到数据库以及从数据库中Load图片
    设计模式Command(命令模式)
    一个强大而且好用的UML设计工具
  • 原文地址:https://www.cnblogs.com/luotianshuai/p/6775141.html
Copyright © 2011-2022 走看看