Python【知识点】傻傻的函数内变量
问题的由来
有个学生问我一个问题关于函数内部变量的我们来一起看下代码:
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【知识点】傻傻的函数内变量的更多相关文章
- python学习day11 函数Ⅲ (内置函数与lambda表达式)
函数Ⅲ(内置函数&lambda表达式) 1.函数小高级 函数可以当做变量来使用: def func(): print(123) func_list = [func, func, func] # ...
- Python 函数内变量的作用域
Python程序中创建.改变.查找变量名时,都是在一个保存变量名的空间中进行,我们称之为命名空间,也被称之为作用域. 全局作用域(global):即在模块层次中定义的变量,每一个模块都是一个全局作用域 ...
- Python中的函数与变量
本节内容 函数的定义方法 函数功能 函数的返回值 函数的形参与实参 全局变量与局部变量 递归 函数的作用域 匿名函数lambda 函数式编程 常用内置函数 其他内置函数 函数 函数的定义方法 函数就相 ...
- python中的函数和变量
本节内容 函数的定义方法 函数功能 函数的返回值 函数的形参与实参 全局变量与局部变量 递归 函数的作用域 匿名函数lambda 函数式编程 常用内置函数 其他内置函数 函数 函数的定义方法 函数就相 ...
- python语法基础-函数-内置函数和匿名函数-长期维护
################## 内置函数 ####################### """ 一共是 68个内置函数: 反射相关的内置函 ...
- 【Python】—— 获取函数内部变量名称
原文出处: https://blog.csdn.net/maixiaochai/article/details/88693507 关键语句: func_vars = func.__code__.co_ ...
- python中修改函数内部的变量会发生什么
最近写python遇到个函数内部变量使用外部变量的问题,现在总结下吧 #!/usr/bin/env python a = 100def su(): a = a + 1 print(a) s = su( ...
- Python基础三. 函数、lambda、filter、map、reduce
一.概述 函数, 就是用一些语句组织起来实现一组特定的功能, 用来重复调用. 函数的作用及意义:最大化的重用代码和最小化的代码冗余以及对流程的分解. Python中有哪些函数: 内建的函数 第三方模块 ...
- python入门15 函数
函数的主要作用是实现代码复用 1 python内置函数 2 匿名函数lambda 3 自定义函数 def functionname(arg):... #coding:utf-8 #/usr/bin/p ...
随机推荐
- kettle学习笔记(七)——kettle流程步骤与应用步骤
一.概述 流程主要用来控制数据流程与数据流向 应用则是提供一些工具类 二.流程步骤 1.ETL元数据注入 类似Java中的反射,在设计时不知道文件名.文件位置等,在真正执行时才知道具体的一些配置等信息 ...
- Android提权原理
Android的内核就是Linux,所以Android获取root其实和Linux获取root权限是一回事儿. 你想在Linux下获取root权限的时候就是执行sudo或者su,接下来系统会提示你输入 ...
- Django Rest Framework源码剖析(一)-----认证
一.简介 Django REST Framework(简称DRF),是一个用于构建Web API的强大且灵活的工具包. 先说说REST:REST是一种Web API设计标准,是目前比较成熟的一套互联网 ...
- 20155218 《网络对抗技术》 MAL_恶意代码分析
20155218 <网络对抗技术> MAL_恶意代码分析 实验内容: 1.使用schtasks指令监控系统运行 1.在C盘下新建一个文本文档,输入一下内容后,更名为netstatlog.b ...
- Android与Libgdx环境配置
此处所说的是基于windows和android版本的libgdx环境配置. 1. 下载所需软件 JDK 1.7. 下载地址: window x86版本地址: http://www.oracle.com ...
- SpringMVC RestTemplate的几种请求调用
转载:https://blog.csdn.net/ThinkingLink/article/details/45366777 1.用统一的方法模板进行四种请求:POST,PUT,DELETE,GET ...
- Python3 str去除空格
一.去除str两端空格(strip()) a.去除左端空格 lstrip() str0='abcdef' str1=' abcdef' print(str0) print(str1.lstrip() ...
- SimpleDateFormat的一些常用用法
/** SimpleDateFormat函数语法: G 年代标志符 y 年 M 月 d 日 h 时 在上午或下午 (1~12) H 时 在一天中 (0~23) m 分 s 秒 S 毫秒 E 星期 D ...
- 【Alpha】第二次Scrum meeting
本次会议内容概括如下: 总结了今天各成员分配任务完成情况,对消耗时间进行统计 评估了各自对团队的贡献(影响)程度 初步讨论了日后需要逐步完成的一些任务并发布在github上 具体内容如下表所示: Me ...
- Linux内核分析第三周学习笔记
linux内核分析第三周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...