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

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

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

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

例如:

代码语言:python
代码运行次数:0
复制
def foo():
    locals()['x'] = 1

foo()

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

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

例如:

代码语言:python
代码运行次数:0
复制
def foo():
    globals()['x'] = 1

foo()

或者

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

foo()

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

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

相关·内容

nextline函数_在JAVA中Scanner中的next()和nextLine()为什么不能一起使用?

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

2.7K10
  • 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',

    56220

    深度辨析 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 是一门灵活的动态语言。

    65520

    深度辨析 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,为什么它不能代表真正的局部命名空间?为什么局部命名空间无法被动态修改?...复制代码 在以上例子中,我的隐私数据就被暴露了。

    59250

    深度辨析 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 是一门灵活的动态语言。

    3K00

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

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

    40410

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

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

    1.2K20

    Python的exec

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

    78920

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

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

    19440

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

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

    3.4K60

    Python命名空间和作用域介绍

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

    74010

    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

    38720

    Python 动态赋值的陷阱

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

    1.5K30

    当 Python 中混进一只薛定谔的猫……

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

    52910

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

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

    66910

    开源图书《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节),所以那些“你懂得我的意思就是意思意思”的表述,不要出现在程序中。

    36220

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

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

    1.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。

    82820
    领券