问题的由来

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

Code1

 x = 50

 def func():
print(x)
global x
print("x修改前的值:", x)
x = 2
print("x修改后的值:", x) func() """
输出结果为:
50
x修改前的值: 50
x修改后的值: 2
"""

我们知道我们要在函数内部修改全局变量必须使用global才可以?那我们看下面的代码

Code2

 test_dict = {"name": "luotianshuai", "age": 18}

 def func():
print(test_dict)
print("修改前:", test_dict)
test_dict["age"] = 16
print("修改后:", test_dict) func() """
输出结果:
{'name': 'luotianshuai', 'age': 18}
修改前: {'name': 'luotianshuai', 'age': 18}
修改后: {'name': 'luotianshuai', 'age': 16}
"""

额?问题来了为什么不用global我就可以修改全局变量呢?

问题解释

在Code1代码中

 x = 50

 def func():
x = 2
"""
x = 2 这段代码是有歧义的,因为它即可表示引用全局变量x,也可以表示创建一个局部变量
所以在python中,默认它的行为是创建局部变量,除非显式声明global.
""" 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。

Python【知识点】傻傻的函数内变量的更多相关文章

  1. python学习day11 函数Ⅲ (内置函数与lambda表达式)

    函数Ⅲ(内置函数&lambda表达式) 1.函数小高级 函数可以当做变量来使用: def func(): print(123) func_list = [func, func, func] # ...

  2. Python 函数内变量的作用域

    Python程序中创建.改变.查找变量名时,都是在一个保存变量名的空间中进行,我们称之为命名空间,也被称之为作用域. 全局作用域(global):即在模块层次中定义的变量,每一个模块都是一个全局作用域 ...

  3. Python中的函数与变量

    本节内容 函数的定义方法 函数功能 函数的返回值 函数的形参与实参 全局变量与局部变量 递归 函数的作用域 匿名函数lambda 函数式编程 常用内置函数 其他内置函数 函数 函数的定义方法 函数就相 ...

  4. python中的函数和变量

    本节内容 函数的定义方法 函数功能 函数的返回值 函数的形参与实参 全局变量与局部变量 递归 函数的作用域 匿名函数lambda 函数式编程 常用内置函数 其他内置函数 函数 函数的定义方法 函数就相 ...

  5. python语法基础-函数-内置函数和匿名函数-长期维护

    ##################     内置函数        #######################  """ 一共是 68个内置函数: 反射相关的内置函 ...

  6. 【Python】—— 获取函数内部变量名称

    原文出处: https://blog.csdn.net/maixiaochai/article/details/88693507 关键语句: func_vars = func.__code__.co_ ...

  7. python中修改函数内部的变量会发生什么

    最近写python遇到个函数内部变量使用外部变量的问题,现在总结下吧 #!/usr/bin/env python a = 100def su(): a = a + 1 print(a) s = su( ...

  8. Python基础三. 函数、lambda、filter、map、reduce

    一.概述 函数, 就是用一些语句组织起来实现一组特定的功能, 用来重复调用. 函数的作用及意义:最大化的重用代码和最小化的代码冗余以及对流程的分解. Python中有哪些函数: 内建的函数 第三方模块 ...

  9. python入门15 函数

    函数的主要作用是实现代码复用 1 python内置函数 2 匿名函数lambda 3 自定义函数 def functionname(arg):... #coding:utf-8 #/usr/bin/p ...

随机推荐

  1. Android 导入工程文件引用包出错

    解决办法:将工程文件夹和引用文件夹需在同一目录下,问题解决.

  2. ZOJ 4016 Mergeable Stack(利用list模拟多个栈的合并,STL的应用,splice函数!!!)

    Mergeable Stack Time Limit: 2 Seconds      Memory Limit: 65536 KB Given initially empty stacks, ther ...

  3. 关于Android开发环境的演变

    是不是我天生就不适合安装软件——经过eclipse.jdk.Android Studio的历次安装,我发觉自己似乎永远都装不好.去年eclipse断断续续装了三四天,那时希望能附加C++的软件包,却始 ...

  4. Codeforces round 1111

    CF Div 2 537 比赛链接 感觉题目难度OK,五个题都能做,后俩题考察人的翻译水平... 另外,$Claris$太强了... A 直接按照题意模拟,不知道为啥有人会被× 代码: #includ ...

  5. MSP430F5438A的串口

    设置串口,最关键的是波特率的设置,推荐一个网站,很方便地计算波特率,http://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/MSP43 ...

  6. 20155211《网络对抗》Exp02 后门原理与实践

    20155211<网络对抗>Exp02 后门原理与实践 实验内容 (1)使用netcat获取主机操作Shell,cron启动 (2)使用socat获取主机操作Shell, 任务计划启动 ( ...

  7. PHP和PHPINFO

    PHP开放源码和跨越平台,PHP可以运行在WINDOWS和多种版本的LINUX上.它不需要任何预先处理而快速反馈结果,它也不需要mod_perl的调整来使您的服务器的内存映象减小.PHP消耗的资源较少 ...

  8. Luogu P4071 [SDOI2016]排列计数

    晚上XZTdalao给我推荐了这道数论题.太棒了又可以A一道省选题了 其实这道题也就考一个错排公式+组合数+乘法逆元 我们来一步一步分析 错排公式 通俗的说就是把n个1~n的数排成一个序列A,并使得所 ...

  9. 汇编 EAX,EBX,ECX,EDX,寄存器

    知识点: 寄存器EAX 寄存器AX 寄存器AH 寄存器AL 一.EAX与AX,AH,AL关系图 一格表示一字节 #include <Windows.h> int _tmain(int ar ...

  10. python数据图形化—— matplotlib 基础应用

    matplotlib是python中常用的数据图形化工具,用法跟matlab有点相似.调用简单,功能强大.在Windows下可以通过命令行 pip install matplotlib 来进行安装. ...