动态设置局部变量[重复]

2023-11-22

如何在Python中动态设置局部变量(变量名是动态的)?


与已发布的其他答案相反,您无法修改locals()直接并期望它能起作用。

>>> def foo():
    lcl = locals()
    lcl['xyz'] = 42
    print(xyz)


>>> foo()

Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    foo()
  File "<pyshell#5>", line 4, in foo
    print(xyz)
NameError: global name 'xyz' is not defined

修改locals()未定义。在函数外部时locals() and globals()是一样的,它会起作用;在函数内部它会usually不行。

使用字典,或在对象上设置属性:

d = {}
d['xyz'] = 42
print(d['xyz'])

或者如果您愿意,可以使用一个类:

class C: pass

obj = C()
setattr(obj, 'xyz', 42)
print(obj.xyz)

Edit: 访问命名空间中不是函数的变量(因此模块、类定义、实例)通常是通过字典查找来完成的(正如 Sven 在注释中指出的那样,也有例外,例如定义了__slots__)。函数局部变量可以针对速度进行优化,因为编译器(通常)提前知道所有名称,因此在您调用之前不存在字典locals().

在Python的C实现中locals()(从函数内部调用)创建一个从局部变量的当前值初始化的普通字典。在每个函数内任意数量的调用locals()将返回相同的字典,但每次调用locals()将用局部变量的当前值更新它。这会给人这样的印象:对字典元素的赋值被忽略(我最初写的是这种情况)。对返回的字典中现有键的修改locals()因此只会持续到下一次调用locals()在同一范围内。

在 IronPython 中,事情的工作方式有点不同。任何调用的函数locals()它内部使用字典作为局部变量,因此对局部变量的赋值会更改字典,对字典的赋值会更改变量BUT仅当您明确调用时locals()在这个名字下。如果您将不同的名称绑定到localsIronPython 中的函数然后调用它会为您提供名称绑定范围的局部变量,并且无法通过它访问函数局部变量:

>>> def foo():
...     abc = 123
...     lcl = zzz()
...     lcl['abc'] = 456
...     deF = 789
...     print(abc)
...     print(zzz())
...     print(lcl)
...
>>> zzz =locals
>>> foo()
123
{'__doc__': None, '__builtins__': <module '__builtin__' (built-in)>, 'zzz': <built-in function locals>, 'foo': <function foo at 0x000000000000002B>, '__name__': '__main__', 'abc': 456}
{'__doc__': None, '__builtins__': <module '__builtin__' (built-in)>, 'zzz': <built-in function locals>, 'foo': <function foo at 0x000000000000002B>, '__name__': '__main__', 'abc': 456}
>>>

这一切都可能随时改变。唯一可以保证的是,您不能依赖于分配给返回的字典的结果locals().

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态设置局部变量[重复] 的相关文章

随机推荐

  • 不同语言(即 Java 和 C++)中的“随机”生成器如何比较?

    尽管标题很奇怪 但我想问一个合理的问题 哪种方法生成的数字更多random Java 的Random 类或Math random 或 C 的rand 我听说 PHPrand 非常糟糕 也就是说 如果你绘制它的结果 你可以清楚地看到一个模式
  • 使用 current_session_context_class 属性 hibernate 3 hibernate 4

    我有一个使用 Spring 和 Hibernate3 的应用程序在生产中运行良好 以下是 Spring 的 applicationContext xml 中会话工厂的配置
  • 是否有实现排列运算的 C++ 类?

    是否有实现排列和排列组运算的C 模板类 此类必须实现求积 求逆 乘法等 我不知道有哪一个 但它应该很容易实现 在内部 您可以将排列表示为向量 例如 1 3 4 2 7 5 6 是 1 7 的 Perm 发送 1 gt 1 2 gt 3 3
  • 如何按应用程序过滤Android logcat? [复制]

    这个问题在这里已经有答案了 如何按应用程序过滤 Android logcat 输出 我需要这个 因为当我连接设备时 由于来自其他进程的垃圾邮件 我找不到我想要的输出 编辑 原文如下 当 Android Studio 还不存在时 但如果你想过
  • Fragment 和 FragmentStatePagerAdapter 内带有 ViewPager 的 Fragment 会导致异常(带有完整示例)

    我有一个带有 ViewPager 的简单片段 我正在使用最新的支持库 v4 rev18 如果我第一次显示子片段 一切正常 如果我返回并再次显示它 应用程序会崩溃 并出现以下异常 我有一个完整的示例 显示何时发生以下异常 java lang
  • Javascript 提供哪些调试日志记录工具? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我想创建一个 通用 调试日
  • Func<> 与委托和 lambda 表达式之间的区别[重复]

    这个问题在这里已经有答案了 在深入了解 C 的更高级功能时 我遇到了一些代码 但我并不完全知道其中的区别 这是关于这两行 Func
  • 关闭主窗体

    我正在使用 C Windows 表单开发一个简单的应用程序 主窗体打开另一个窗体 但我不想要这两种窗体 我希望当第二个表单打开时第一个表单关闭 由于第一种形式主要使用 this Close 显示第二个表格后将关闭两者 所以我用这个代替 pr
  • 在 C/C++ 中向指针添加 1 个字节的正确方法是什么?

    我现在正在使用这段代码将指针移动 1 个字节 但我感 觉有些不清楚 int a int malloc sizeof int void b char a 1 char是 1 个字节 但未定义用于字节操作目的 我相信还有另一种方法可以做到这一点
  • 有没有办法在 Azure DevOps CI/CD 构建管道中设置日期和时间(时区)

    我在 CI CD 构建管道中运行了自动化测试 但 DevOps 中的时间是 UTC 我的断言测试检查本地时间 有没有办法在我的构建管道中设置时区 使用 Powershell 您可以执行以下操作 Get TimeZone Set TimeZo
  • 无法将数据库状态与会话同步

    无法将数据库状态与会话同步 org hibernate exception GenericJDBCException 无法更新 我在尝试更新数据库时收到此错误 我的数据库中没有定义唯一键 但 id 字段已定义为主键 这是更新函数的代码 pu
  • Chrome 打印预览不加载 @media 仅打印字体

    我想要一个与屏幕不同的打印字体 不幸的是 Google Chrome 打印预览 适用于其他浏览器 不会加载字体 也不会显示文本 但如果您第二次尝试 字体将被加载 然后 Google Chrome 打印预览将显示文本 这是一个可以重现问题的小
  • 从字符串中删除字符及其后的所有内容

    我知道要替换字符串的字符串 但只有当我确切知道要删除的内容时 这才有效 如果我有一个如下所示的字符串 嗨 那里 这是一个测试 功能 嗨 那里 如何删除 feature 及其后的所有内容 任何帮助将不胜感激 提前致谢 编辑 如果绝对需要使用
  • 从 NodeJS 中的 keycloak 会话获取用户名

    有没有类似的东西 request getUserPrincipal getName Java 在Node中我们使用时获取用户名连接钥匙斗篷使用快速中间件 我也遇到了这个问题 我确实深入研究了中间件代码并试图找到类似的东西 事实证明 requ
  • CSS 导入字体

    我需要在网站上使用 4 种字体 并且我的网站文件夹中有这些文件 Baskerville ttc BellGothicstd Black otf BellGothicstd Bold otf JennaSue ttf 我尝试使用 Import
  • 如何解析 shell 脚本中的符号链接

    给定绝对或相对路径 在类 Unix 系统中 我想在解析任何中间符号链接后确定目标的完整路径 同时解决 用户名符号的奖励积分 如果目标是一个目录 则可以 chdir 进入该目录 然后调用 getcwd 但我真的想从 shell 脚本中执行此操
  • 声纳违规:安全性 - 数组直接存储

    存在声纳违规 声纳违规 安全性 数组直接存储 public void setMyArray String myArray this myArray myArray 解决方案 public void setMyArray String new
  • 如何在 React Native 中抑制由于第三方 PropTypes 库而产生的警告

    在 React Native 中使用样式表时 我收到了大量警告 如下图所示 iOS 模拟器上的警告 怎么抑制呢 无法禁用特定组件的警告 但您可以在应用程序中禁用不同类型的警告 要禁用所有警告 请使用 console disableYello
  • 外部硬盘上的 MySQL 表

    我有大量文本数据需要导入MySQL 我在 MacBook 上执行此操作 但没有足够的空间 因此我想将其存储在外部硬盘驱动器中 目前我并不真正关心速度 这只是为了测试 最好的方法是什么 在外部硬盘上安装 MySQL 这在 Mac 上可行吗 在
  • 动态设置局部变量[重复]

    这个问题在这里已经有答案了 如何在Python中动态设置局部变量 变量名是动态的 与已发布的其他答案相反 您无法修改locals 直接并期望它能起作用 gt gt gt def foo lcl locals lcl xyz 42 print