首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用 exec 函数时需要注意的一些安

众所周知,在 python 可以使用 exec 函数来执行包含 python 源代码的字符串: >>> code = ''' ...: a = "hello" ...: print(a)...全局变量和内置函数 在 exec 执行的代码,默认可以访问执行 exec 时的局部变量和全局变量, 同样也修改全局变量。...可以通过执行 exec 函数的时候再传两个参数的方式来 修改这种行为(详见 之前 关于 exec 的文章): >>> g = {} >>> l = {'b': 'world'} >>> exec('hello...NameError: name 'hello' is not defined 如果要限制使用内置函数的话,可以在 globals 参数定义一下 __builtins__ 这个 key: >>> g =...: name 'int' is not defined >>> 现在我们限制了访问和修改全局变量以及使用内置函数,难道这样就万事大吉了吗?

74520

Python深入04 闭包

在面向过程编程,我们见到过函数(function);在面向对象编程,我们见过对象(object)。函数和对象的根本目的是以某种逻辑方式组织代码,并提高代码的可重复使用性(reusability)。...如果line()的定义引用了外部的变量,会发生什么呢?...我们称b为line的环境变量。事实上,line作为line_conf的返回值时,line已经包括b的取值(尽管b并不隶属于line)。...在Python,所谓的闭包是一个包含有环境变量取值的函数对象。环境变量取值被保存在函数对象的__closure__属性。...这个元组的每个元素是cell类型的对象。我们看到第一个cell包含的就是整数15,也就是我们创建闭包时的环境变量b的取值

572100
您找到你想要的搜索结果了吗?
是的
没有找到

python3eval函数用法简介

pythoneval函数的用法十分的灵活,这里主要介绍一下它的原理和一些使用的场合。...globals:这个参数管控的是一个全局的命名空间,也就是我们在计算表达式的时候可以使用全局的命名空间中的函数,如果这个参数被提供了,并且没有提供自定义的__builtins__,那么会将当前环境的_...关于__builtins__,它是python的内建模块,也就是python自带的模块,不需要我们import就可以使用的,例如我们平时使用的int、str、abs等都在这个模块。...locals:这个参数管控的是一个局部的命名空间,和globals类似,不过当它和globals中有重复的部分时,locals里的定义覆盖掉globals的,也就是当globals和locals中有冲突的部分时...我们首先来看一下,对于a为6我们是没有疑问的,因为在上个例子已经说了,g屏蔽程序的全局变量的,而这里最主要的是为什么b是100呢?

1K90

python安装、数据类型和变量

在windows添加python的环境变量,如下: 计算机或我的电脑右击打开属性--系统高级设置 ? 添加python的安装路径,可在用户或系统变量添加,加入后确认即可 ?...linux安装python 如果本机安装了python2,尽量不要管他,使用python3运行python脚本就好,因为可能有程序依赖目前的python2环境 比如yum!!!!!...,使源码不可见 [root@localhost src]# python 2.pyo holle world 1.4 python变量 变量是计算机内存的一个存储数值,变量可以存储规定范围内的值,且值可以改变...python下变量是对一个数据的引用 变量命名规则 以字母、数字、下划线组合 不能以数字开头 不可以使用关键字 变量的赋值 a = 1 id (a) id是查看变量在内存的地址 python...,否则会将这个abc识别为一个变量 --------------------------------------------------------------------------- NameError

57020

#21 Python异常

try来捕捉它,先来看最简单的使用方法: 1 name = 'MinuteSheep' # 初始化变量name 2 print(name) # 将变量name打印出来 3 4 print(...age) # 将变量age打印出来,并没有初始化age,抛出变量错误异常 5 6 # 运行结果: 7 MinuteSheep # 正确打印出name变量 8 Traceback (...# 将变量age打印出来,并没有初始化age,抛出变量错误异常 11 NameError: name 'age' is not defined 1 name = 'MinuteSheep'...2 print(name) 3 4 try: # 使用try捕捉异常 5 print(age) 6 except NameError: # 当NameError出现时,执行下列代码块...15 我是NameError 长上面代码可以看出,当有多个except语句时,从第一个except语句开始匹配,如果匹配到则执行对于的代码块,剩下的except语句则不运行。

1K20

Python的命名空间和作用域(1)

例如,x = 'foo'的x是一个变量,它应用了字符串对象'foo'。 在一个复杂的程序创建成百上千个这样的变量名称或者函数名称、类名称等,每个名称都指向特定的对象。...全局(global),模块定义的名称,记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。 局部(local),函数定义的名称,记录了函数的变量,包括函数的参数和局部定义变量。...(类定义的也是) ? 每个命名空间有不同的声明周期,当Python执行一个程序时,根据需要创建命名空间,并在不需要时删除。通常,在任何给定的时间都会存在许多命名空间。...当Python运行时,这些可以直接使用。...如果解释器在这些位置找不到名称,那么Python将抛出NameError异常。 下面是LEGB规则的几个例子。在每种情况下,最里面的闭包函数g() 都试图向控制台显示名为x的变量的值。

86810

Python基础入门_4函数

函数 定义:函数是组织好的,可重复使用,用于实现单一或者相关联功能的代码段。 在 Python 既有内建函数,比如 print()、sum() ,也可以用户自定义函数。...,使用代码如下,可以查看预定义了哪些变量: import builtins print(dir(builtins)) 输出的预定义变量如下: ['ArithmeticError', 'AssertionError...会报命名错误 NameError ,提示该变量没有定义。...sa= 2 NameError: name 'o_count' is not defined 全局变量和局部变量 全局变量和局部变量的区别主要在于定义的位置是在函数内部还是外部,也就是在函数内部定义的是局部变量...,但最后一种方式并不推荐,原因主要是 Python 可能存在很多相同名称的变量和函数,这种方式可能覆盖相同名称的变量和函数。

1K20

python3 和 python2的区别

Python2相对路径的import导致标准库导入变得困难(想象一下,同一目录下有file.py,如 何同时导入这个文件和标准库file)。...这种等价机制导致部分IDE使用存在问题。.... 2) 废弃类差异 1. print语句被Python3废弃,统一使用print函数 2. exec语句被python3废弃,统一使用exec函数 3. execfile语句被Python3废弃,推荐使用...=" 5. long整数类型被Python3废弃,统一使用int 6. xrange函数被Python3废弃,统一使用range,Python3range的机制也进行修改并提高 了大数据集生成效率 7...raise IOError("file error") #抛出异常 2. except NameError as err: #捕捉异常 3. for循环中变量值区别 Python2,for循环修改外部相同名称变量的值

1.6K10

【Python】已解决报错:NameError: name ‘xxx‘ is not defined

:修正导入错误 方案三:解决条件语句错误 方案四:定义变量 注意事项 总结 前言 在Python编程NameError 是一种常见的错误,它发生在尝试访问一个未被定义变量时。...顾名思义,NameError 错误表明 Python 解释器在代码遇到了一个它不认识的名称。 这通常发生在变量、函数或模块在被使用之前没有被正确定义或导入。...变量定义:在使用变量之前没有进行定义或赋值。 条件语句错误:在条件语句中定义变量,未在所有分支定义。...理解作用域:了解变量的作用域,避免在错误的代码块访问它们。 检查导入:确保所有需要的模块和库都已正确导入。 初始化变量:在使用变量之前,确保它们已经被定义和初始化。...代码审查:定期进行代码审查,以识别和修复可能导致NameError的潜在问题。 使用IDE或编辑器的自动完成功能:这有助于避免拼写错误并快速找到正确的变量名。

41020

Python: 受限制的 函数调用

需求背景 最近在工作上, 遇到了一个比较特殊的需求: 为了安全, 设计一个函数或者装饰器, 然后用户在 "定义/调用" 函数时, 只能访问到我们允许的内置变量和全局变量 通过例子来这解释下上面的需求...引入别的模块, 然后再执行模块的方法, 也是可行的!...Python_project/ftp/2.py', '__package__': None, 's': {...}, '__name__': '__main__', '__doc__': None} 3 可以看出, 我们并没有定义变量...比如说, 我不确定有多少个变量, 希望通过一个变量名列表, 动态生成这些变量, 在这种情况下, 就能参考这种方法, 不过还是希望谨慎使用, 因为修改了这个, 就是就修改了全局命名空间...., 关于代码运行原理, 其实在关键部位的代码, 都已经加了注释, 可能在exec那部分会比较迷惑, 但其实大家将对应的变量代入字符串就能懂了, 替换之后, 其实也就是函数的定义+执行, 可以通过print

68230

Python 两个内置函数: 【locals 】和 【globals】

在理解这两个函数时,首先来理解一下 Python 的名字空间概念。Python 使用叫做名字空间的东西来记录变量的轨迹。名字空间只是一个字典,它的键字就是变量名,字典的值就是那些变量的值。...每个函数都有着自已的名字空间,叫做局部名字空间,它记录了函数的变量,包括函数的参数和局部定义变量。...如果函数定义了一个局部变量 x,Python将使用这个变量,然后停止搜索。 • 2、全局名字空间 - 特指当前的模块。...如果模块定义了一个名为 x 的变量,函数或类,Python将使用这个变量然后停止搜索。 • 3、内置名字空间 - 对每个模块都是全局的。...所以对 globals 所返回的 dictionary 的任何的改动都会直接影响到全局变量取值。 ? 输出结果为: ? ? END

63610

理解 Python 的 LEGB

我们定义了两次 i,在 test 函数是 i-L,在外面是 i-G。...enclosing 外部嵌套函数的名字空间(闭包中常见) globals 全局变量,函数定义所在模块的名字空间 builtins 内置模块的名字空间 所以,在 Python 检索一个变量的时候,优先回到...locals 里面来检索,检索不到的情况下检索 enclosing ,enclosing 没有则到 globals 全局变量里面检索,最后是到 builtins 里面来检索。...: name 'x' is not defined 如上面栗子那样,在函数声明 a 为全局变量,则函数 f 的 locals只有参数 x,而没有变量,而在外部可以使用变量 a,而使用 x 的时候则是...在 Python3提供了一个 nonlocal关键字来修改外部嵌套函数的名字空间,但是要使用 Python3才有,我等使用 Python2的只能眼馋一下。

72910

深度辨析 Python 的 eval() 与 exec()

主要的区别是,exec() 的第一个参数不是表达式,而是代码块,这意味着两点:一是它不能做表达式求值并返回出去,二是它可以执行复杂的代码逻辑,相对而言功能更加强大,例如,当代码块赋值了新的变量时,该变量可能...然而,在实际使用过程,存在很多微小的细节,此处就列出我所知道的几点吧。...(略去部分报错信息) print(y) NameError: name 'y' is not defined 明明看到了局部命名空间中有变量 y,为何会报错说它未定义呢?...原因与 Python 的编译器有关,对于以上代码,编译器先将 foo 函数解析成一个 ast(抽象语法树),然后将所有变量节点存入栈,此时 exec() 的参数只是一个字符串,整个就是常量,并没有作为代码执行...直到解析第二个 print() 时,此时第一次出现变量 y ,但因为没有完整的定义,所以 y 不会被存入局部命名空间。

62720

【Shell】算术运算符、流程控制、函数使用、数组以及加载其它文件的变量

其格式 为: 需求: 计算 1~100 的和 运行脚本,输出: 使用使用了 Bash let 命令,它用于执行一个或多个表达式,变量计算不需要加上 $ 来表示变量,...取值后面必须为单词 in ,每一模式必须以右括号结束。取值可以为变量或常 数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;; 。 取值将检测匹配的每一个模式。...1.8 函数使用 1 函数的快速入门 格式 可以带 function fun() 定义,也可以直接 fun() 定义 , 不带任何参数。...当 n>=10 时,需要使用 ${n} 来获取参数。 另外,还有几个特殊字符用来处理参数: 1.9 数组 1 定义数组 数组可以存放多个值。...Shell 文件包含的语法格式如下: 2 练习 定义两个文件 test1.sh 和 test2.sh ,在 test1 定义一个变量 arr=(java c++ shell), 在 test2

3.1K30

深入探讨Python的命名空间与作用域

在Python,每个模块都有自己的全局命名空间,模块定义变量可以在整个模块中被访问。...x时,优先使用局部变量x,而不是全局变量x。...nonlocal关键字在Python 3使用nonlocal关键字可以在内部函数修改外部嵌套函数的局部变量。...使用nonlocal x声明后,可以修改外部函数outer的局部变量x,这样可以避免全局变量使用提高了代码的封装性和可维护性。...但是尝试直接修改x导致错误,因为外部变量x被限制在了闭包内部,不能被直接修改。使用闭包实现私有变量闭包也可以用来实现私有变量的概念。在Python,没有严格意义上的私有变量,但可以通过闭包来模拟。

4320

深度辨析 Python 的 eval() 与 exec()

在《Python进阶:如何将字符串常量转为变量?》这篇文章,我提到过 eval() 和 exec() ,但对它们并不太了解。为了弥补这方面知识,我就重新学习了下。...主要的区别是,exec() 的第一个参数不是表达式,而是代码块,这意味着两点:一是它不能做表达式求值并返回出去,二是它可以执行复杂的代码逻辑,相对而言功能更加强大,例如,当代码块赋值了新的变量时,该变量可能...然而,在实际使用过程,存在很多微小的细节,此处就列出我所知道的几点吧。...(略去部分报错信息) print(y) NameError: name 'y' is not defined 明明看到了局部命名空间中有变量 y,为何会报错说它未定义呢?...原因与 Python 的编译器有关,对于以上代码,编译器先将 foo 函数解析成一个 ast(抽象语法树),然后将所有变量节点存入栈,此时 exec() 的参数只是一个字符串,整个就是常量,并没有作为代码执行

2.9K00

【Python】函数 ⑥ ( 变量作用域 | 局部变量 | 全局变量 | global 关键字 | 代码示例 )

指的是 定义在 函数变量 , 只在 函数 内部可访问 , 函数 外部无法访问 函数的局部变量 ; 局部变量的作用是 在 函数运行时 , 临时保存 临时变量 数据 , 函数运行结束 , 局部变量会被销毁...'sum_num' , 运行时会报错 NameError: name 'sum_num' is not defined ; """ 局部变量 代码示例 """ # 定义函数 以及 局部变量 def...; 3、代码示例 - 函数体内修改全局变量失败 在下面的代码 , 定义了全局变量 sum_num , 如果要在 add 函数 , 读取该全局变量 , 可以直接读取 ; 但是如果要修改改全局变量 ,...直接使用 sum_num = a + b 代码 重新为 全局变量赋值 , 该操作相当于在 函数 重新定义了一个新的局部变量 , 在函数执行完毕后 就会销毁 , 该 局部变量 sum_num 与 全局变量...在下面的代码 , 如果要修改改全局变量 , 不能直接使用 sum_num = a + b 代码 , 需要先使用 global sum_num 代码 , 声明一下下面将要使用全局变量 sum_num

26210
领券