《python 与数据挖掘 》一 3.4 作用域

本节书摘来自华章出版社《python 与数据挖掘 》一书中的第3章,第3.4节,作者张良均 杨海宏 何子健 杨 征,更多章节内容可以访问“华章计算机”公众号查看。

3.4 作用域

Python在创建、改变或查找变量名时都是在命名空间中进行的,更准确地说,是在特定作用域下进行的。所以我们需要使用某个变量名时,应清晰地知道其作用域。由于Python不能声明变量,所以变量第一次被赋值的时候已经与一个特定作用域绑定了。更通俗地说,在代码中给一个变量赋值的地方决定了这个变量将存在于哪个作用域,它可见的位置在哪里。
首先举一个函数的例子,如果有这样的函数:


def defin_x():
    x = 2
然后执行命令:
>>> x = 1
>>>defin_x()
>>>print x
>>>1

执行函数defin_x后函数外的x的值没有变化。这是因为整段程序中存在两个x,起初在函数体外创建了一个x,接着执行defin_x()时又在函数内部创建了一个新的x和一个新的命名空间。第二个x的作用域是defin_x()函数的内部代码块,赋值语句x = 2仅在局部作用域(即函数内部)起作用。所以它不会使得函数外的x发生改变。我们把函数内的变量称为局部变量(Local Variable),而在主程序中的变量称为全局变量(Global Variable)。在函数内部是可以访问到全局变量的:

def print_x():
    print x
>>>x = 1
>>>print_x()
>>>1

程序没有发生报错并正确返回了1,所以在函数内部同样可以使用全局变量。
通过前面的例子我们已经知道,函数内既可访问局部变量也可访问全局变量。如果局部变量和全局变量出现重名,那最终会访问哪一个呢?实际上,第一个例子已经说明了这个问题,在局部作用域中,如果全局变量与局部变量重名,那么全局变量会被局部变量屏蔽。如果想访问全局变量,可以使用globals函数:

def print_x():
    x = 2
    print  globals()['x']
>>> x = 1
>>>print_x()
>>>1
再考虑另一个方向的问题:我们如何在函数内创建全局变量呢?可以使用global进行声明:
def defin_x():
    global x
    x = 2
>>>x = 1
>>>defin_x()
>>>print x
>>>2

函数内部使用global声明了变量名x的作用域是全局的,因而程序访问的是全局变量x。虽然global似乎很好用,但我建议程序中尽量少用global,它会使代码变得混乱,可读性变差。相反,局部变量会使代码更加抽象,封装性更好。一个好的函数只有输入和输出能够和函数外的程序进行联系。

时间: 2024-11-16 11:10:03

《python 与数据挖掘 》一 3.4 作用域的相关文章

《python 与数据挖掘 》 一 导读

前 言 为什么要写本书? Python是什么? Python是一种带有动态语义的.解释性的.面向对象的高级编程语言.其高级内置数据结构,结合动态类型和动态绑定,使其对于敏捷软件开发非常具有吸引力.同时,Python作为脚本型(胶水)语言连接现有的组件也十分高效.Python语法简洁,可读性强,从而能降低程序的维护成本.不仅如此,Python支持模块和包,鼓励程序模块化和代码重用. Python语言的解释性使其语法更接近人类的表达和思维过程,开发程序的效率极高.习惯使用Python者,总习惯在介绍

《python 与数据挖掘 》一3.5 上机实验

本节书摘来自华章出版社<python 与数据挖掘 >一书中的第3章,第3.2节,作者张良均 杨海宏 何子健 杨 征,更多章节内容可以访问"华章计算机"公众号查看. 3.5 上机实验 1.实验目的掌握函数的编写和变量的作用域.2.实验内容使用递归算法,编写一个函数计算斐波那契数列的第n项(注意使用该算法求斐波那契数列是很低效的,这里仅作为程序编写的练习).样本输入:n=10样本输入:89

深入探究Python中变量的拷贝和作用域问题

  这篇文章主要介绍了Python中变量的拷贝和作用域问题,包括一些赋值.引用问题,以及相关函数在Python2和3版本之间的不同,需要的朋友可以参考下 在 python 中赋值语句总是建立对象的引用值,而不是复制对象.因此,python 变量更像是指针,而不是数据存储区域, 这点和大多数 OO 语言类似吧,比如 C++.java 等 ~ 1.先来看个问题吧: 在Python中,令values=[0,1,2];values[1]=values,为何结果是[0,[...],2]? ? 1 2 3

《python 与数据挖掘 》一 3.3 可变对象与不可变对象

本节书摘来自华章出版社<python 与数据挖掘 >一书中的第3章,第3.3节,作者张良均 杨海宏 何子健 杨 征,更多章节内容可以访问"华章计算机"公众号查看. 3.3 可变对象与不可变对象 Python的所有对象可分为可变对象和不可变对象(见表3-1).所谓可变对象是指,对象的内容可变,而不可变对象是指对象内容不可变. 我们在前面已经介绍过数值类型是不可变对象,当程序尝试改变数据的值时,程序会重新生成新的数据,而不是改变原来的数据. 之所以本书要将这部分内容放到函数这一

《python 与数据挖掘 》一第1章 数据挖掘概述 1.1 数据挖掘简介

本节书摘来自华章出版社<python 与数据挖掘 >一书中的第1章,第1.1节,作者张良均 杨海宏 何子健 杨 征,更多章节内容可以访问"华章计算机"公众号查看. 第1章 数据挖掘概述 广义的数据挖掘是指针对收集的大规模数据,应用整套科学工具和挖掘技术(如数据.计算.可视化.分析.统计.实验.问题定义.建模与验证等),从数据之中发现隐含的.对决策有参考意义的信息.价值和趋势.因此,数据挖掘是一个横跨多学科的计算机科学分支.强调它隶属计算机科学范畴,是希望读者认识到这个领域的

《python 与数据挖掘 》一 2.5 文件的读写

本节书摘来自华章出版社<python 与数据挖掘 >一书中的第2章,第2.5节,作者张良均 杨海宏 何子健 杨 征,更多章节内容可以访问"华章计算机"公众号查看. 2.5 文件的读写 文件访问是一门语言重要的一环,适当地进行文本读写能够保存一次程序运行下来的结果.在数据挖掘的工作中,数据量很大,整个挖掘程序可以分为几部分,我们应该把每一部分运行的结果都保存下来,这样如果后面的程序出现错误,我们也不必再从头开始.而数据挖掘中最普遍的是对txt.csv等文件进行读写处理. 2.

《python 与数据挖掘 》一 2.4 数据结构

本节书摘来自华章出版社<python 与数据挖掘 >一书中的第2章,第2.4节,作者张良均 杨海宏 何子健 杨 征,更多章节内容可以访问"华章计算机"公众号查看. 2.4 数据结构 Python中的绝大部分数据结构可以被最终分解为三种类型:标量(Scaler),序列(Sequence),映射(Mapping).这表明了数据存储时所需的基本单位,其重要性如同欧式几何公理之于欧式空间.在第2.2节中,我们已经详细叙述了"标量",如整数.浮点数等数据类型.这里

《python 与数据挖掘 》一1.3 Python开发环境的搭建

本节书摘来自华章出版社<python 与数据挖掘 >一书中的第1章,第1.3节,作者张良均 杨海宏 何子健 杨 征,更多章节内容可以访问"华章计算机"公众号查看. 1.3 Python开发环境的搭建 所谓编程语言,意指"与计算机交流时使用的语言".它是一种被标准化的交流技 巧,用于连接程序员的思维和计算机的操作.学习编程语言的第一关,就是安装和环境配置.我们必须与计算机约定如何理解代码.指令和语法,才能够顺利地与计算机交流,赋予它复杂的功能.Python

《python 与数据挖掘 》一 2.3 流程控制

本节书摘来自华章出版社<python 与数据挖掘 >一书中的第2章,第2.3节,作者张良均 杨海宏 何子健 杨 征,更多章节内容可以访问"华章计算机"公众号查看. 2.3 流程控制 流程控制是一门程序语言的基本,掌握Python流程控制语句就已经能够实现很多算法了.本节主要介绍Python的条件分支结构if语句和两种主要循环结构while语句和for语句,并在最后详细讲解Python函数的用法.如果读者有一定的编程基础,对条件分支.循环和函数这3种结构比较熟悉,那么本节的内