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

Python:为什么我不能使用locals()修改函数中的当前范围?

在Python中,locals()函数用于返回当前局部命名空间的字典。这个字典包含了所有当前作用域内的变量名和它们的值。然而,locals()函数返回的字典是只读的,不能用于修改当前作用域的变量。

当你尝试使用locals()来修改函数中的当前范围时,Python会抛出一个TypeError异常,因为locals()返回的是一个只读字典。

例如:

代码语言:python
复制
def foo():
    locals()['x'] = 1

foo()

这段代码会抛出TypeError异常,因为locals()返回的字典是只读的,不能用于修改变量。

如果你想要在函数中动态地修改变量名,可以使用globals()函数或者使用一个字典来存储变量。

例如:

代码语言:python
复制
def foo():
    globals()['x'] = 1

foo()

或者

代码语言:python
复制
def foo():
    variables = {'x': 1}
    # 使用variables字典来存储和访问变量

foo()

总之,locals()函数不能用于修改函数中的当前范围,因为它返回的是一个只读字典。如果你需要动态地修改变量名,可以使用globals()函数或者使用字典来存储变量。

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

相关·内容

nextline函数_在JAVAScannernext()和nextLine()为什么不能一起使用

大家好,又见面了,是你们朋友全栈君。...回车符 “\r” 它被丢弃在缓冲区,现在缓冲区,只有一个 \r ,于是 下一次 nextLine 扫描时候就又扫描到了 \r,返回它之前内容,也是啥都没有 “” ,然后再把 \r 去掉, 对于...这个扫描器在扫描过程判断停止依据就是“结束符”,空格,回车,tab 都算做是结束符 而坑点在于 next 系列,也就是下面这些函数:next nextInt nextDouble nextFloat...这些函数与 nextLine 连用都会有坑 坑点就是 next 系列函数返回了数据后,会把回车符留在缓冲区,因此我们下一次使用 nextLine 时候会碰到读取空字符串情况 解决方案:输入都用...nextLine ,做格式转换 输入 next 系列函数调用后,中间调用一次 nextLine 调用去掉了回车符后,再调用一次 nextLine 调用真正输入我们数据 都使用 nextLine: class

2.6K10

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

locals:该函数返回当前局部范围内所有变量组成“变量字典” vars(object):获取在指定对象范围内所有变量组成“变量字典”。...globals和 locals看似完全不同,但它们实际上也是有联系,这两个函数区别有如下两点: locals()函数总是获取当前局部范围内所有变量组成“变量字典”,因此,如果在全局范围内(在函数之外...但实际上,不管是使用 globals()还是使用 locals()获取全局范围“变量字典”,都可以被修改,而这种修改会真正改变全局变量本身,但通过 locals获取局部范围“变量字典”,即使对它修改也不会影响局部变量.../python_knowledge/common_resources/books/书/免费/Python编程思想/05-函数与lambda表达式/locals_globals_test.py',.../python_knowledge/common_resources/books/书/免费/Python编程思想/05-函数与lambda表达式/locals_globals_test.py',

52520

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

2、exec 基本用法 语法:exec(object[, globals[, locals]]) 在 Python2 exec 是个语句,而 Python3 将其改造成一个函数,像 print 一样...3、一些细节辨析 两个函数都很强大,它们将字符串内容当做有效代码执行。这是一种字符串驱动事件 ,意义重大。然而,在实际使用过程,存在很多微小细节,此处就列出所知道几点吧。...>>> result = exec('1 + 1') >>> print(result) None 两个函数 globals 和 locals 参数,起到是白名单作用,通过限定命名空间范围,防止作用域内数据被滥用...至于为什么 locals() 取出结果有 y,为什么不能代表真正局部命名空间?为什么局部命名空间无法被动态修改?...5、安全替代用法 既然有种种安全隐患,为什么要创造出这两个内置方法呢?为什么使用它们呢? 理由很简单,因为 Python 是一门灵活动态语言。

62120

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

2、exec 基本用法 语法:exec(object[, globals[, locals]]) 在 Python2 exec 是个语句,而 Python3 将其改造成一个函数,就像 print...3、一些细节辨析 两个函数都很强大,它们将字符串内容当做有效代码执行。这是一种字符串驱动事件 ,意义重大。然而,在实际使用过程,存在很多微小细节,此处就列出所知道几点吧。...>>> result = exec('1 + 1') >>> print(result) None 复制代码 两个函数 globals 和 locals 参数,起到是白名单作用,通过限定命名空间范围...至于为什么 locals() 取出结果有 y,为什么不能代表真正局部命名空间?为什么局部命名空间无法被动态修改?...复制代码 在以上例子隐私数据就被暴露了。

53750

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

2、exec 基本用法 语法:exec(object[, globals, locals]) 在 Python2 exec 是个语句,而 Python3 将其改造成一个函数,就像 print 一样...3、一些细节辨析 两个函数都很强大,它们将字符串内容当做有效代码执行。这是一种字符串驱动事件 ,意义重大。然而,在实际使用过程,存在很多微小细节,此处就列出所知道几点吧。...>>> result = exec('1 + 1') >>> print(result) None 两个函数 globals 和 locals 参数,起到是白名单作用,通过限定命名空间范围,防止作用域内数据被滥用...至于为什么 locals() 取出结果有 y,为什么不能代表真正局部命名空间?为什么局部命名空间无法被动态修改?...5、安全替代用法 既然有种种安全隐患,为什么要创造出这两个内置方法呢?为什么使用它们呢? 理由很简单,因为 Python 是一门灵活动态语言。

2.8K00

由一个例子到python名字空间

比如名字空间都是在代码编译时期确定,而不是执行期间。这个也就可以解释为什么在例1,before func2:locals()里面包含了x: 1 这一项。...这个就跟例子2,before func2里面没有x是一个道理。 赋值 为什么要把赋值单独列出来呢,因为赋值操作对名字空间影响很大,而且很多地方需要注意。...内部函数只可以读取外部函数变量,而不能修改,其实本质还是因为赋值涉及到了新建locals()名字。...所以直接修改locals()并不能影响x(可以使用exec 动态访问,不再细述)。 不过赋值操作,会同时刷新locals()和FAST区域。...---- 查了不少资料,说了这么多,只想说,作为python最核心东西,名字空间还有很多很多地方需要探究,比如 作用域(scope)与名字空间, 这里只是模糊了二者区别 面向对象,也就是类名字空间

36910

什么是Python变量作用域

在程序定义一个变量时,这个变量是有作用范围,变量作用范围被称为它作用域。 根据定义变量位置,变量分为两种: 局部变量:在函数定义变量,包括参数,都被称为局部变量。...locals():该函数返回当前局部范围内所有变量组成“变量字典”。 vars(object):获取在指定对象范围内所有变量组成“变量字典”。...globals() 和 locals() 看似完全不同,但它们实际上也是有联系,关于这两个函数区别和联系大致有以下两点: locals() 总是获取当前局部范围内所有变量组成“变量字典”,因此,如果在全局范围内...一般来说,使用 locals() 和 globals() 获取“变量字典”只应该被访问,不应该被修改。...但实际上,不管是使用 globals() 还是使用 locals() 获取全局范围“变量字典”,都可以被修改,而这种修改会真正改变全局变量本身:但通过 locals() 获取局部范围“变量字典

64720

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

前言 之所以写这篇文章,源自于我遇到一个问题: Python 我们可以通过 exec 执行一段字符串构成代码: 可以看到 exec 是可以影响当前代码变量,为了在一个干净环境下执行,一开始是这样写...: 但是,最近写一个小工具,需要使用 exec 执行一段比较完整代码,却出了问题,下面用一个简单例子表示: 为什么会报错呢?...,Python 会做一些准备,比如一些内置函数,这些会保存在 frame builtins 字典 接下来执行第一句代码后: 当我们定义一个变量,那么就会把变量信息设置到当前 frame locals...global 关键字可以让我们在函数里面修改全局变量 其实约等价于: 行5:直接修改 globals 字典,同时避免在 locals 里面创建了变量 ---- exec 问题 回到 exec 问题上...与 locals 如果只设置了 globals 而没有设置 locals,则 locals 使用 globals 字典 现在来看看为什么这段代码报错: 由于我们设置了模块 frame globals

1K20

Pythonexec

参考链接: Python命名空间和范围 目录  exec()简单使用  动态执行简单字符串代码  动态执行较复杂代码  执行文件Python代码  在exec传参  ​  使用遇到问题...3.运行期局部命名空间不可改变,这意味着 exec() 函数变量赋值不会对它产生影响,但 locals() 字典是可变,会受到 exec() 函数影响。...为什么呢,因为locals()会包含在当前局部作用域中所有的局部变量。由于loc本身也是一个局部变量,所以就造成了循环引用。 ...咦,这里就出现了一个有趣问题,按理来说,在example3()函数,第2行定义了loc,这里loc在第3行第4行执行完成后是会被exec修改,即loc是肯定有“a0”"a1"“a2”“a3”"...也不太明白为什么会产生这样报错,也许这是exec和占位符设计问题吧,由此也可以得出一个结论,在代码要获取exec动态执行变量值,建议还是不要重名,避免定位这些细小琐碎问题花费较多时间。

75220

python技巧实战应用,函数参数自动收集并批量处理

而我需要自定义一个与它参数一样函数,里面做一些小处理后,调用它函数: 为了让函数有智能提示,这里不能使用 *args 与 **kws 收集参数 把传入字符串处理一下 这里问题是,难道一定要把参数逐一传入原函数吗...行24:不能在调用 locals 之前定义变量 其实有了参数字典,批量处理字符串参数问题就很容易解决。 虽然这里没有什么问题,但是通常来说,我们不应该在遍历时修改原字典。...可以换成推导式或复制再修改 但是,现在有好几个这种间接调用函数。难道每一个都要像上面那样写一大串代码吗?...办法总比困难多,既然不能直接使用 locals ,那就让外面传进来吧: 调用时候就需要使用 locals 还能不能再简化?每次都要传入 locals ,不符合"懒人"风格。...以前就有两篇文章讲解过调用栈。当 python 每次进入一个函数,都会启用一个"帧栈",用于保存当前函数执行过程信息。这些信息当然包括了定义变量。

14640

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

locals(可选)-另一个字典,用于指定可用本地方法和变量。 稍后将在本文中显示对global(全局变量)s和locals(本地变量)使用。 eval在Python做什么?...因此,Pythoneval 还有两个参数,即viz-globals和locals。 全局变量是当前全局范围或命名空间中可用对象。您可以从代码任何位置访问它们。...但是,为什么甚至没有将值传递给globals参数上述示例中都没有发生这种错误?...因此,在上面的示例,我们可以自由访问所有变量,因为它们是当前全局范围包含全局变量。...不能将关键字参数与eval()一起使用 这似乎令人困惑,但是在下面的示例同时使用了globals和locals参数,您将看到它们如何影响结果。

3.3K60

Python命名空间和作用域介绍

相对应,全局变量则是定义在整个文件层次上,可以在文件内任何地方被访问,在函数内部也是可以。但是我们不能函数内部随意修改全局变量值。...如果要执行这样操作,需要在函数内部加上global A这个声明。 global关键字用来在函数或其他局部作用域中使用全局变量。但是如果不修改全局变量也可以不使用global关键字。...我们可以使用nonlocal关键字在嵌套函数内部改变改变嵌套作用域变量(L改变E变量)。...: 1、局部作用域改变全局变量(L修改G变量)用global, global同时还可以定义新全局变量 2、内层函数改变外层函数变量(在L修改E变量)用nonlocal,nonlocal不能定义新外层函数变量...locals() 函数会以字典类型返回当前位置全部局部变量(local symbol table)。

69710

python面试题总结

函数执行完成后,这块内存空间就被释放了,这些局部变量也就失效了,因此离开函数之后就不能再访问局部变量了 全局变量: 在函数外面、全局范围内定义变量,被称为全局变量 全局变量意味着它们可以在所有函数内被访问...: 该函数返回当前局部范围内所有变量组成“变量字典” vars: 获取在指定对象范围内所有变量组成“变量字典”。...) # 依然输出20 # 通过globals函数修改x全局变量 globals()['x'] = 19 一般来说,使用 locals() 和 globals() 获取“变量字典”只应该被访问...但实际上,不管是使用 globals() 还是使用 locals() 获取全局范围“变量字典”,都可以被修改,而这种修改会真正改变全局变量本身:但通过 locals() 获取局部范围“变量字典...python 代码实现删除一个 list 里面的重复元素 统计一个文本单词频次最高 10 个单词 请写出一个函数满足以下条件 使用单一列表生成式来产生一个新列表 用一行代码生成1,4,9,16,25,36,49,64,81,100

35120

Python 动态赋值陷阱

花下猫语:在上一篇文章《Python与家国天下》第三节Python 猫之口介绍了关于局部作用域变量解析问题,还引入了抽象语法树隐藏内容,最后触及了 CPython 底层实现原理边界...然而,在使用过程,有一个陷阱需要注意:globals() 可读可写,而 locals() 只可读却不可写。今天分享文章,就是在探究这个问题,写得很深入,特分享给大家。...Python命名空间通过一种字典形式来体现, 而具体到函数也就是locals() 和 globals(), 分别对应着局部命名空间和全局命名空间....应该也能修改局部命名空间.修改函数局部变量....但是不能简单通过改变这个代理, 来改变A, B, C真正拥有的东西!

1.4K30

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

在理解这两个函数时,首先来理解一下 Python 名字空间概念。Python 使用叫做名字空间东西来记录变量轨迹。名字空间只是一个字典,它键字就是变量名,字典值就是那些变量值。...当一行代码要使用变量 x 值时,Python 会到所有可用名字空间去查找变量。 按照如下顺序: • 1、局部名字空间 - 特指当前函数或类方法。...如果函数定义了一个局部变量 x,Python使用这个变量,然后停止搜索。 • 2、全局名字空间 - 特指当前模块。...使用 import module,模块自身被导入,但是它保持着自已名字空间,这就是为什么你需要使用模块名来访问它函数或属性(module.function)原因。...locals 是只读,globals 不是。 locals 不可修改,globals 可以修改 原因: locals() 实际上没有返回局部名字空间,它返回是一个拷贝。

62510

Python 混进一只薛定谔猫……

图片来源:pexels Python 是一门强大动态语言,那动态体现在哪里,强大又体现在哪里呢? 除了好方面,Python 动态性是否还藏着一些使用陷阱呢,有没有办法识别与避免呢?...因此,这篇文章将前面一些内容融汇起来,再做一次延展讨论,希望能够理清一些使用细节,更深入地探索 Python 语言奥秘。...(2)多元知识储备 以上例子在细微之处有较大不同,主要由于以下知识点影响: 1、变量声明与赋值 2、locals() 取值与修改逻辑 3、locals() 字典与局部命名空间关系 4、函数编译...关于函数编译,在《Python与家国天下》写到了对抽象语法树分析,Python 在编译时就确定了局部作用域内合法变量名,在运行时再与内容绑定。...不敢保证每个细节都准确无误,但这个分析力求达到深入浅出、面面俱到、逻辑自恰,而且顺便幽默有趣…… 例 0 ,局部作用域内虽然没有 ‘y’,但 exec() 函数动态创建了它,因此动态地写入了 locals

51010

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

7.3.3 作用域 以7.3.2节定义 out() 函数 inner() 函数为例,在 out() 函数所在区域不能调用 inner() 函数(见7.3.2节报错信息),其根源即为这里介绍作用域...print(locals()) ... >>> m, n = 1, 2 >>> f(m, n) {'p': 1, 'q': 2, 's': 'python'} 在函数 f() 调用 locals()...这说明,在本地作用域不能修改全局作用域中变量。 如果去掉注释(11)前面 a = 1 ,即成为执行后会报错那个函数: >>> def bar(): ......或许读者会说,“意思是注释(13)中等号右侧变量 a 是全局作用域中定义 a = 1”,可惜 Python “不懂心”。...《Python 之禅》中有这样一句:“明瞭优于隐晦”(参阅第1章1.4节),所以那些“你懂得意思就是意思意思”表述,不要出现在程序

33020

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

这些内置函数允许你访问全局和本地命名空间字典。 globals()函数 内置函数globals()返回对当前全局命名空间字典,你可以使用它来访问全局命名空间中对象。...此外,不能使用locals()返回值来修改实际本地命名空间中对象: 1 >>> def f(): 2 ... s = 'foo' 3 ......修改作用域之外变量 如果你已经读过《Python大学实用教程》这本书,一定已经知道Python函数参数,有的是按位置引用,有的是按值引用;有的参数值能够修改,有的不能修改。...事实上,在本例,global x语句不仅不能提供对闭包作用域内x访问,而且还在全局范围内创建了一个名为x对象,其值为40: >>> def f(): ......在Python使用关键字global至少可以明确表示函数正在修改一个全局变量。在许多语言中,函数只需赋值就可以修改全局变量,而不必以任何方式声明它。这使我们非常难以追踪全局数据修改位置。

1K20

一文搞懂python内建函数,自己添加一个print函数

python同学应该都用过print函数,这个函数我们没有定义为什么可以调用?...python内建函数指的是python自带函数,这种函数不需要定义,并且不同内建函数具有不同功能,可以直接使用。 2、内置内建函数多有哪些?...官方文档说明链接:Built-in Functions — Python 3.9.7 documentation 这里截图了函数,可以做一个概览,看名字也能猜出这些函数都是做什么 对上面的函数进行分组...kind参数指定string参数中所含代码类别 3.4 globals和locals globals()会以字典类型返回当前位置全部全局变量。...locals()以字典类型返回当前位置全部局部变量。 对于函数, 方法, lambda 函式, 类, 以及实现了 call 方法类实例, 它都返回 True。

74820
领券