首页
学习
活动
专区
工具
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 中 localsglobals、builtins 属性可以查阅变量信息 查找一变量先后顺序locals > globals > builtins...global 关键字可以让我们在函数里面修改全局变量 其实约等价于: 行5:直接修改 globals 字典,同时避免locals 里面创建变量 ---- exec 问题 回到 exec 问题上

1.2K20

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

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

10610

由一例子到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()。

38910

什么Python变量作用域

一般来说,使用 locals() 和 globals() 获取变量字典”只应该被访问,不应该被修改。...但实际上,不管使用 globals() 还是使用 locals() 获取全局范围内变量字典”,都可以被修改,而这种修改会真正改变全局变量本身:但通过 locals() 获取局部范围内变量字典...x': 5, 'y': 20} # 在全局访问内使用locals函数,访问全局变量变量数组” print(locals()) # {..., 'x': 5, 'y': 20} # 直接访问x全局变量...因此这行代码相当于重新定义了 name 局部变量,这样 name 全局变量就被遮蔽了,所以程序会报错。 为了避免这个问题,可以通过以下两种方式修改上面程序: 访问被遮蔽全局变量。...为了避免在函数中对全局变量赋值(不是重新定义局部变量),可使用 global 语句声明全局变量

66620

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

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

14810

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

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

85510

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语句声明全局变量

54520

开源图书《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 一定要谨慎,因为它们都会产生副作用。

35720

Python 动态赋值陷阱

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

1.4K30

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(): ......当函数在本地作用域之外修改数据时,无论使用关键字globalnonlocal,还是直接就地修改可变类型,都会产生副作用。这种副作用类似于在函数中修改它参数。

1K20

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

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

1.6K20

python神奇函数之eval()学习

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

40100

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()函数使用:  #!

80310

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

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

1K21

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

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

3.3K60

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

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

77640

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

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

45320
领券