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

使用globals()或locals()来避免创建很少需要的变量是个好主意吗?

使用globals()或locals()来避免创建很少需要的变量并不是一个好主意。

globals()和locals()是Python内置函数,用于获取全局和局部命名空间中的变量。它们返回一个字典,其中包含了当前命名空间中的所有变量。

尽管可以使用globals()或locals()来动态地获取和操作变量,但这种做法会导致代码的可读性和可维护性下降。在编写代码时,应该尽量避免使用这种方式来创建和管理变量。

创建很少需要的变量会增加代码的复杂性,并且可能导致变量名冲突和不必要的内存占用。相反,应该根据需要有意识地创建和命名变量,以提高代码的可读性和可维护性。

如果需要在不同的作用域中共享变量,可以考虑使用函数参数、全局变量或类属性等方式来传递和访问变量。

总结起来,使用globals()或locals()来避免创建很少需要的变量并不是一个好主意,应该根据需要有意识地创建和管理变量,以提高代码的可读性和可维护性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Python进阶:你定义的变量到底保存在哪里

: 但是,最近我写一个小工具,需要使用 exec 执行一段比较完整的代码,却出了问题,下面用一个简单例子表示: 为什么会报错呢?...: 从左下方调用堆栈列表可以看到,Python 创建了一个新的 frame 既然是新的 frame,locals 字典就是空的,因为还没有创建变量。...与 上一层的 frame 的 globals 是同一个字典 现在执行函数的第一句代码: 首先要执行 a+10 ,a 变量怎么来?...python 会创建一个 frame,frame 中的 locals、globals、builtins 属性可以查阅变量信息 查找一个变量的先后顺序是:locals > globals > builtins...global 关键字可以让我们在函数里面修改全局变量 其实约等价于: 行5:直接修改 globals 字典,同时避免在 locals 里面创建了变量 ---- exec 的问题 回到 exec 的问题上

1.2K20

【Python内功心法】:深挖内置函数,释放语言潜能

) # 输出: The sum is: 15 注意:尽管 eval() 可用于动态执行代码或计算字符串形式的表达式,但应谨慎使用,特别是在处理用户输入时,以避免代码注入攻击。...最佳实践是尽量寻找更安全的替代方案,如使用 ast.literal_eval() 处理安全的字面量数据结构,或者直接编写代码来避免执行用户提供的代码。...4. eval与exec 中 globals与locals如何用 ☔4-1 globals 参数 globals 参数接受一个字典对象,用于指定全局变量的名称和值。...由于 eval() 函数的局部环境是固定的,因此它无法读取或修改其他变量定义。...所有的 Python 可迭代对象都可以通过 iter() 函数生成一个迭代器。 迭代器的优点在于可以逐个返回元素,从而可以直接在序列上进行操作,而不需要创建一个新的列表或元组。

12610
  • 由一个例子到python的名字空间

    访问方式 其实上面都已经说了,这里暂时简单列一下 使用locals()访问局部命名空间 使用globals()访问全局命名空间 这里有一点需要注意,就是涉及到了from A import B 和import...按照LEGB原则, 搜到func1有变量x并且是个list, 然后将其加入到自己的locals(), 后面的x[0] += x[0], 就开始读取x的元素,并没有影响func2的名字空间。...这是因为locals()空间是在函数调用的时候才创建! 而闭包只是返回了一个函数, 并没有调用,也就没有所谓的空间。...globals()来创建名字 In [3]: globals()['a'] = 'abcde' In [4]: a Out[4]: 'abcde' 但是locals()在函数里面的话, 貌似是不起作用的...区域来优化访问速度,而实际上解释器访问对象时,是从FAST区域里面读取的,而非locals()。

    40410

    【python中的eval(),exec()及相关函数】

    如果它是一个字符串,它会被当作一个(使用globals和locals参数作为全局和本地命名空间的)Python表达式进行分析和解释。...返回值: 如果expression是一个code对象,且创建该code对象时,compile函数的mode参数是’exec’,那么eval()函数的返回值是None; 否则,如果expression是一个输出语句...函数定义: exec(object[, globals[, locals]]) 参数说明: object:必选参数,表示需要被指定的Python代码。它必须是字符串或code对象。...这永远是当前模块的字典(在一个函数或方法内部,这是指定义该函数或方法的模块,而不是调用该函数或方法的模块) locals() 描述: Update and return a dictionary representing...注意: locals()返回的字典的内容不应该被改变;如果一定要改变,不应该影响被解释器使用的局部变量和自由变量。

    17410

    Python中的eval()、exec()及其相关函数

    如果它是一个字符串,它会被当作一个(使用globals和locals参数作为全局和本地命名空间的)Python表达式进行分析和解释。...返回值: 如果expression是一个code对象,且创建该code对象时,compile函数的mode参数是’exec’,那么eval()函数的返回值是None; 否则,如果expression是一个输出语句...函数定义: exec(object[, globals[, locals]]) 参数说明: object:必选参数,表示需要被指定的Python代码。它必须是字符串或code对象。...这永远是当前模块的字典(在一个函数或方法内部,这是指定义该函数或方法的模块,而不是调用该函数或方法的模块) locals() 描述: Update and return a dictionary representing...注意: locals()返回的字典的内容不应该被改变;如果一定要改变,不应该影响被解释器使用的局部变量和自由变量。

    89610

    Python编程思想(20):变量作用域

    从这个角度来看,不管是局部范围还是全局范围,这些变量和它们的值就像一个“看不见” 的字典,其中变量名就是字典的key,变量值就是字典的 value。...但实际上,不管是使用 globals()还是使用 locals()获取的全局范围内的“变量字典”,都可以被修改,而这种修改会真正改变全局变量本身,但通过 locals获取的局部范围内的“变量字典”,即使对它修改也不会影响局部变量...在全局访问内使用locals函数,访问的是全局变量的“变量数组” print(locals()) # {..., 'x': 5, 'y': 33} # 直接访问x全局变量 print(x) # 5 #...因此这行代码相当于重新定义了name局部变量,这样name全局变量就被遮蔽了,所以这段代码就会报错。 为了避免这个问题,可以通过两种方式来修改上面程序。...() print(name) # Mike 2.在函数中声明全局变量 为了避免在函数中对全局变量赋值(不是重新定义局部变量),可使用 global语句来声明全局变量。

    56220

    开源图书《Python完全自学教程》7.3.3作用域

    Python 解释器会根据名称定义的位置和及其在代码中的引用位置来确定作用域,以下按照搜索顺序列出各个作用域(如图7-3-2所示): 本地作用域(或称“局部作用域”):假设在一个函数中引用 x,解释器首先在该函数本地的最内部作用域内搜索它...x 的变量,然后执行 globals() 函数,返回的是一个字典,在这个字典中包含了刚才创建的变量及其所引用的对象。...a ,注释(13)试图通过赋值语句创建一个本地作用域的变量 a ,然而该赋值语句右侧又用到变量 a ,由于与在本地试图创建的变量同名,故将它视为本地作用域的变量,又因为这个变量此前没有定义,这就相当于用一个没有定义的变量与整数...虽然本地作用域中依然没有变量 a ,也不会影响 a = a + 1 的执行。并且,当使用 globals() 查看全局作用域时,发现 a 的值已经是 2 。...于是 print() 的结果显示为 40 。 必须要说明,在程序中使用 global 或 nonlocal 一定要谨慎,因为它们都会产生副作用。

    36220

    Python 动态赋值的陷阱

    由于篇幅所限,还有一个重要的知识内容没谈,即“locals() 与 globals() 的读写问题”。之所以说这个问题重要,是因为它可以实现一些灵活的动态赋值的功能。 它们都是字典类型,用法不需多言。...然而,在使用过程中,有一个陷阱需要注意:globals() 可读可写,而 locals() 只可读却不可写。今天分享的文章,就是在探究这个问题,写得很深入,特分享给大家。...) ---- 在工作中, 有时候会遇到一种情况: 动态地进行变量赋值 , 不管是局部变量还是全局变量, 在我们绞尽脑汁的时候, Python已经为我们解决了这个问题....这个是什么鬼, 这个需要源码来解答: // ceval.c 从上往下, 依次是相应函数或者变量的定义 // 指令源码 TARGET(STORE_FAST) { v = POP(); SETLOCAL..., 实际是就是帧对象的f的成员f_localsplus, 这是一个数组, 了解函数创建的童鞋可能会比较清楚, 在CALL_FUNCTION时, 会对这个数组进行初始化, 将形参赋值什么都会按序塞进去,

    1.5K30

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

    注意:内置命名空间的用法不同于字典。Python将其作为一个模块来实现。 Python提供了名为globals()和locals()的内置函数。这些内置函数允许你访问全局和本地的命名空间字典。...locals()函数 Python还提供了一个相应的内置函数locals()。它类似于globals(),但它访问的是本地命名空间中的对象: >>> def f(x, y): ......此外,不能使用locals()的返回值来修改实际的本地命名空间中的对象: 1 >>> def f(): 2 ... s = 'foo' 3 ......全局声明 如果确实需要从f()中修改全局作用域中的值,该怎么办? 在Python中使用全局声明是可行的: >>> x = 20 >>> def f(): ......当函数在本地作用域之外修改数据时,无论是使用关键字global或nonlocal,还是直接就地修改可变类型,都会产生副作用。这种副作用类似于在函数中修改它的一个参数。

    1.1K20

    如何使用python 执行命令行传入的代码

    globals 实参必须是一个字典。locals 可以是任何映射对象。...如果 locals 字典被省略则它默认为 globals 字典。 如果两个字典都被省略,则将使用调用 eval() 的环境中的 globals 和 locals 来执行该表达式。...globals() 和 locals() 函数分别返回当前的全局和本地字典,可供传给 eval() 或 exec() 使用。 如果给出的源数据是个字符串,那么其前后的空格和制表符将被剔除。...如果只提供了 globals,则必须为字典对象(而不能是字典的子类),同时用于存放全局变量和局部变量。如果提供了 globals 和 locals,则将分别用于全局变量和局部变量。...locals 可以是任意字典映射对象。请记住,在模块级别,globals 和 locals 是同一个字典。

    1.7K20

    python神奇函数之eval()学习

    对象了      locals也是一个可选的对象,如果设置属性不为None的话,可以是任何map对象了  python是用命名空间来记录变量的轨迹的,命名空间是一个dictionary,键是变量名,值是变量值...如果函数定义了一个局部变量 x, 或一个参数 x,Python 将使用它,然后停止搜索。  2)全局名字空间 - 特指当前的模块。...如果模块定义了一个名为 x 的变量,函数或类,Python 将使用它然后停止搜索。  3)内置名字空间 - 对每个模块都是全局的。作为最后的尝试,Python 将假设 x 是内置函数或变量。 ...python的全局名字空间存储在一个叫globals()的dict对象中;局部名字空间存储在一个叫locals()的dict对象中。...我们可以用print (locals())来查看该函数体内的所有变量名和变量值。  下面简单演示一下eval()函数的使用:  #!

    81810

    python 变量作用域和列表

    变量作用域 变量由作用范围限制 分类:按照作用域分类 全局(global):在函数外部定义 局部(local):在函数内部定义 变量的作用范围 全局变量:在整个全局范围都有效 全局变量在局部可以使用(即函数内部可以访问函数外部定义的变量...)\n print("Globals={0}".format(globals()))\n \nfun(100, 200)'} eval()函数 把一个字符串当成一个表达式来执行,...创建空列表 l1 = [] # type是内置函数,负责打印出变量的类型 print(type(l1)) print(l1) # 2....下面显示的是为空,因为默认分片总是从左向右截取 print(l[-2:-4]) print(l[-4:-2]) # 如果分片一定左边值比右边大,则步长参数需要使用负数 # 此案例为一个list直接正反截取提供了一个思路...l = [3,5,6,8,5,43,4,7] ll = l[:] # 分片操作 lll = ll # 如果两个id值一样,则表明分片产生的列表是使用的同一地址同一份数据 # 否则,则表明分片是重新产生了一份数据

    1.1K107

    python神奇函数之eval()学习

    对象了      locals也是一个可选的对象,如果设置属性不为None的话,可以是任何map对象了  python是用命名空间来记录变量的轨迹的,命名空间是一个dictionary,键是变量名,值是变量值...如果函数定义了一个局部变量 x, 或一个参数 x,Python 将使用它,然后停止搜索。  2)全局名字空间 - 特指当前的模块。...如果模块定义了一个名为 x 的变量,函数或类,Python 将使用它然后停止搜索。  3)内置名字空间 - 对每个模块都是全局的。作为最后的尝试,Python 将假设 x 是内置函数或变量。 ...python的全局名字空间存储在一个叫globals()的dict对象中;局部名字空间存储在一个叫locals()的dict对象中。...我们可以用print (locals())来查看该函数体内的所有变量名和变量值。  下面简单演示一下eval()函数的使用:  #!

    40900

    Python中的命名空间、作用域以及lo

    命名空间是一个保存变量名的地方,当在程序中使用变量名时,python创建、改变或者查找都是在所谓的命名空间中进行的。...如果其它文件想引用某一个文件的全局变量,必须先导入该模块文件才能使用这个模块中定义的变量名 .    每次对函数调用都会创建了一个新的本地作用域。 .   ...如果想给一个在函数内部却位于模块文件顶层的变量嘛赋值(也就是说想在函数内部给全局变量名赋值)就需要在函数内部使用global语句声明,否则按照LEGB原则,函数内部会认为它是本地变量。...3、当函数被调用时创建一个本地命名空间,当函数返回结果 或 抛出异常时,被删除。每一个递归调用的函数都拥有自己的命名空间。...与 globals 之间的一个重要的区别 locals 是只读的,globals 不是    locals 实际上没有返回局部名字空间,它返回的是一个拷贝。

    1K21

    Python指南:高级程序设计之过程型程序设计进阶

    下面介绍一种简单的方法,既然函数是对象,那么就可以放到字典中当做键或值来对待。...globals 和 locals参数是可选的,如果提供了globals参数,那么它必须是dictionary类型;如果提供了locals参数,那么它可以是任意的map对象。...这时我们需要使用内置的 exec() 函数,其原型为: exec(object[, globals[, locals]]) object:必选参数,表示需要被指定的Python代码。...globals:可选参数,表示全局命名空间(存放全局变量),如果被提供,则必须是一个字典对象。 locals:可选参数,表示当前局部命名空间(存放局部变量),如果被提供,可以是任何映射对象。...如果调用 exec() 时仅以某些代码作为其唯一的参数,那么没有途径可以存取该代码执行后创建的任何函数或变量,而且,exec() 不能存取任意导入的模块,也不能存取调用时在范围内的任何变量、函数或其他对象

    78540

    eval在python中是什么意思_如何在Python中使用eval ?

    eval函数的语法如下: eval(expression, globals, locals) 如上所示,eval函数采用三个参数:expression –需要一个字符串,该字符串将被解析并评估为Python...locals(可选)-另一个字典,用于指定可用的本地方法和变量。 稍后将在本文中显示对global(全局变量)s和locals(本地变量)的使用。 eval在Python中做什么?...因此,Python中的eval 还有两个参数,即viz-globals和locals。 全局变量是当前全局范围或命名空间中可用的对象。您可以从代码中的任何位置访问它们。...事实证明,当您在不提供globals参数的情况下调用eval函数时,该函数将使用globals()函数返回的字典作为其全局命名空间来评估表达式。...因此,最好避免使用eval函数,但是如果仍然要使用eval函数,我们可以借助globals和locals参数来限制其功能。

    3.4K60

    Python3.6.5标准库文档(完整中文版)—内置函数(五)

    iterable必须是一个序列,一个 迭代器或其他支持迭代的对象。...= None,locals = None ) 参数是一个字符串和可选的全局变量和局部变量。...如果提供,全局变量必须是字典。如果提供,本地可以是任何映射对象。 该表达参数分析,并作为一个Python表达式来使用(从技术上来说,一个条件列表)全局 和当地人 的字典作为全局和局部名字空间。...的globals()和locals()功能返回当前全球和本地词典,分别,其可以是通过以绕过使用有用eval()或exec()。...注意: 默认本地人的行为如locals()下面的功能所述:不应尝试对默认本地人字典的修 改。传递一个明确的当地人解释,如果你需要看到的代码的作用当地人后的功能exec()恢复。

    47120

    Python3通过字符串访问与修改局部变量

    首先我们需要知道,locals()方法返回的变量是一个copy,也就是说即使修改了locals方法返回的结果,也不能真正的改变局部变量本身的值,这样描述可能有点抽象,我们直接看下这个案例: x = 0...: Obj(2) 这个案例是使用了Cython的方案直接去修改了数据帧的内容,而这里所使用的f_locals其实本质上就是locals。...z是被成功修改了的,但是在前面提到的,即使我们通过这种方法修改了局部变量的值,但是依然不能通过这个方案去创建一个新的局部变量,此时去执行print (n)的话,依然会有报错提示。...而不同于locals变量的是,globals函数返回的是一个真实的数据,是可以直接修改,并且在全局生效的。...而有时候我们又需要一些批量化的操作,比如批量化的创建或者修改局部、全局或者是成员变量,这样就需要我们首先要把所有的变量名存成字符串,在需要的时候再作为变量名去调用。

    56620
    领券