Python如何将字符串常量转化为变量?(附示例)

本篇文章给大家带来的内容是关于python如何将字符串常量转化为变量?(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

本文将相关的内容要点作了梳理,并由此引申到更进一步的学习话题,希望对你有所帮助。

1、如何动态生成变量名?

M 同学的问题如下:

打扰一下大家,请教一个问题,已知 list = [‘A’, ‘B’, ‘C’, ‘D’] , 如何才能得到以 list 中元素命名的新列表 A = [], B = [], C = [], D = [] 呢?

简单理解,这个问题的意思是,将字符串内容作为其它对象的变量名。

立即学习“Python免费学习笔记(深入)”;

list 中的元素是字符串,此处的 ‘A’-‘D’ 是常量 ,而在要求的结果中,A-D 是变量 。

如果强行直接将常量当做变量使用,它会报错:

>>> 'A' = []...SyntaxError: can't assign to literal

登录后复制

报错中的literal 指的是字面量 ,这是计算机科学中常见的一个概念,用于表达源代码中的固定值。 例如,整数、浮点数、字符串等基本类型,就是字面量。

字面量指的就是一个量本身,可以理解为一种原子性的实体,当然不能再被赋值了。

所以,取出的字符串内容,并不能直接用作变量名,需要另想办法。

有初学者可能会想,list[0] = [] 行不行?当然不行,因为没有出现 A 。那 A = list[0] ,接着 A = [] 呢?那也不行,因为这里的 A 是你凭空定义出来的,而不是从已有条件中生成的。

当时,群里只有两三个同学参与了讨论,我们没想到解决办法。但是,我觉得这个题目很有意思,值得玩味。

因为,如果能解决这个问题,那就意味着可以不作预先定义,而是动态地生成变量名,这不仅能减少给变量取名的麻烦,还实现了自动编码!

可以设想一下未来,人工智能在编写代码的时候,如果能根据已知条件,动态生成变量名,那编写代码的过程不就顺利多了么?(据说,现在已经有人工智能可以编写代码了,不知它在取变量名时,是用的什么方法?)

2、办法总是有的

最近,学习群里蒙混进来了几个打广告的,为此,我决定提高审核门槛,例如,用群里的问题来作个考核。

万万没想到的是,第一个被考核到的 Q 同学,几乎不假思索地就说出了一个解决上述问题的思路。而偏偏就是那么巧 ,几乎在同时,群内的 J 同学给出了另外一个解决方法(他没看到群内的讨论,而是看到了知识星球的记录,才知道这个问题的)。

也就是说,前一晚还以为无解的问题,在第二天竟得到了两种不同的解决方法!

那么,他们的答案是什么呢?

# J 同学的解答>>> list1 = ['A', 'B', 'C', 'D']>>> for i in list1:>>>     globals()[i] = []>>> A[]

登录后复制

这个方法通过修改全局命名空间,巧妙地“定义”出了新的变量。globals() 方法取出来的是一个字典,字符串 ‘A’ 是其中一个键值(key),而这个键值恰恰是全局命名空间中的一个变量,这就实现了从常量到变量的转化。

在数据结构层面上,空列表 [] 作为一个值(value)跟它的字符串键值绑定在一起,而在运用层面上,它作为变量内容而跟变量名绑定在一起。

看到这个回答的时候,我就突然想起来了,上个月转载过一篇《Python 动态赋值的陷阱》,讲的正是动态地进行变量赋值 的问题啊!我似乎只关注了 globals() 与 locals() 用法的区别,却没有真正地掌握它们的原初用途。

J 同学说,他正是看了那篇文章,才学得了这个方法。这就有意思了,我分享了一个自己囫囵吞枣的知识,然后它被 J 同学吸收掌握,最后反馈回来解决了我的难题。

我真切地感受到了知识分享的魅力:知识在流动中获得生命,在碰撞中锃亮色泽。

同时,我也真切地明白了一个互助的学习团体的好处:利人者也利己,互助者共同进步。

3、动态执行代码的方法

新进群的 Q 同学,提供了一个不同的答案:

# Q 同学的解答>>> list1 = ['A', 'B', 'C', 'D']>>> for i in list1:>>>     exec(f"{i} = []")>>> A[]

登录后复制

他的写法用到了 Python 3.6 才引入的 f-strings 特性,事实上,在较低版本中,也是可以实现的,只需要保证 exec() 方法接收的参数是包含了变量 i 的字符串即可,例如这样写:

# 以下代码可替换上例的第 4 行exec(i + " = []")# 或者:exec("{} = []".format(i))# 或者:exec(' '.join([i, '= []']))

登录后复制

这几种写法的区别只是字符串拼接法的区别,关于如何拼接字符串,以及不同方法之间的区别,可参看《详解Python拼接字符串的七种方式》。

Q 同学这个答案的核心在于 exec() 方法,它是内置的,用途是执行储存在字符串或文件中的代码段。

它的基础用法如下:

>>> exec('x = 1 + 2')>>> x3# 执行代码段>>> s = """>>> x = 10>>> y = 20>>> sum = x + y>>> print(sum)>>> """>>> exec(s)30

登录后复制

看完了 exec() 的用法,我们再回来看 Q 同学的答案。for-循环中取出来的 i 是字符串,而拼接后的字符串经过 exec() 的处理,就获得了动态编写代码的效果。

也就是说,因为字符串常量的内容被当做有效代码而执行了,其中的 ‘A’-‘D’ 元素,就取得了新的身份,变成了最终的 A-D 变量名。

这个方法看起来很简单啊,可是由于 exec() 方法太生僻了,直到 Q 同学提出,我们才醒悟过来。

注意:在 Python3 中,exec() 是个内置方法;而在 Python2 中,exec 是个语句(statement),另外有个 execfile() 方法,两者相合并,就成了 Python3 中的 exec() 方法。本文使用的是 Python3。

4、总结

抽象一下最初的问题,它实际问的是“如何将字符串内容作为其它对象的变量名”,更进一步地讲是——“如何将常量转化为变量 ”。

使用直接进行赋值的静态方法,行不通。

两位同学提出的方法都是间接的动态方法:一个是动态地进行变量赋值,通过修改命名空间而植入变量;一个是动态地执行代码,可以说是通过“走后门”的方式,安插了变量。

两种方法殊途同归,不管是白猫还是黑猫,它们都抓到了老鼠。

这两种方法已经给我们带来了很有价值的启发,同时,因为它们,群内小伙伴们更是发散地讨论一些相关联的话题,例如:S 同学提出了另一种修改命名空间中变量的写法、L 同学提到了 eval() 的意义、eval() 与 exec() 的区别、我查到了为什么要慎用 eval() 、C 与 H 同学提到了 eval() 的安全用法……

以上就是Python如何将字符串常量转化为变量?(附示例)的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2533645.html

(0)
上一篇 2025年3月5日 21:17:52
下一篇 2025年3月5日 21:17:57

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 怎么找到黑客的联系方式?

    如果你想要找到黑客的联系方式,那么你可能面临以下难题:黑客往往会隐藏他们的身份,并且他们的联系方式很难被发现。php小编草莓在这里为你提供了一份指南,旨在帮助你找到黑客的联系方式。在本指南中,我们将介绍一些常见的黑客使用的联系方式,并提供一…

    2025年3月5日
    200
  • python单链表中如何插入和输出节点?(代码示例)

    python单链表中如何插入和输出节点?下面本篇文章就来带大家了解一下单链表是什么,如何对单链表执行的一些非常基本的操作,例如:插入、输出,希望对大家有所帮助。 单链表是什么? 首先在了解单链表之前,我们必须了解一下节点是什么。 节点是链表…

    2025年3月5日
    200
  • python单链表中如何查找和删除节点?

    在之前的文章【python单链表中如何插入和输出节点?】中给大家介绍了单链表是什么,以及如何进行添加节点、输出所以节点。下面本篇文章给大家介绍如何查找和删除节点,希望对大家有所帮助。 如何从单链表中查找节点? 与大多数数据结构一样,查找元素…

    2025年3月5日
    200
  • 如何使用Python中range()方法?

    python中有很多迭代器,比如list、tuple等,range()提供了另一种方法来使用一些条件初始化数字序列。(相关推荐:《python教程》) range()通常用于循环,因此,在处理任何类型的Python代码时,相同的知识是关键方…

    2025年3月5日
    200
  • Python动态定义函数的方法介绍

    本篇文章给大家带来的内容是关于Python动态定义函数的方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 基于 MIT 许可协议 在 Python 中,没有可以在运行时简化函数定义的语法糖。然而,这并不意味着它就不可…

    编程技术 2025年3月5日
    200
  • Python如何初始化列表?

    python是一种非常灵活的语言,可以通过多种方式执行单个任务,例如,可以通过多种方式执行初始化列表。下面本篇文章就来带大家了解几种python初始化的方法,并比较一下这几种方法的效率,希望对大家有所帮助。 下面我们就来介绍在Python中…

    2025年3月5日
    200
  • Python列表如何统计元素的出现频率?(代码示例)

    有时我们需要在列表中查找、统计列表中特定元素出现的数量(频率),那么如何去统计?下面本篇文章就来带大家了解一下在python中统计列表元素出现频率的方法,希望对大家有所帮助。 方法一:使用Counter() + set()+ 列表推导(Li…

    2025年3月5日
    200
  • Python如何删除除字母和数字之外的所有字符?(代码示例)

    字符串操作是日常编码和web开发中非常重要的任务;例如:http查询中的大多数请求和响应都是字符串形式,有时我们需要删除一些无用的数据。下面本篇文章就来给大家介绍一些python方法来将指定字符串中除字母和数字之外的所有字符都删除,希望对大…

    2025年3月5日
    200
  • Python实现给照片换底色(附代码)

    本篇文章给大家带来的内容是关于Python实现给照片换底色(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 现在网上出现了很多在线换底色的网页版工具是这么做的呢?其实用Python就可以实现。 环境要求 Pytho…

    2025年3月5日
    200
  • Python中is 和 ==的详细解析(附代码)

    本篇文章给大家带来的内容是关于python中is 和 ==的详细解析(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 在Python中一切都是对象。 Python中对象包含的三个基本要素,分别是: id(身份标识)…

    编程技术 2025年3月5日
    200

发表回复

登录后才能评论