この記事では、Python で文字列定数を変数に変換する方法について説明します。 (例もあり)ある程度の参考になるので、困っている友達は参考にしていただければ幸いです。
この記事では、関連する内容のポイントを整理し、さらなる学習トピックに拡張しています。
1. 変数名を動的に生成するにはどうすればよいですか?
M 人の学生の質問は次のとおりです:
すみません、質問したいのですが、リスト = ['A', 'B', 'C', 'D' ]、どうすればよいでしょうか?リスト内の要素にちなんで名付けられた新しいリスト A = []、B = []、C = []、D = [] を取得するのはどうでしょうか?
簡単に理解するには、この質問の意味は、文字列の内容を他のオブジェクトの変数名として使用することです。
リスト内の要素は文字列であり、ここでの「A」~「D」は定数であり、必要な結果の A~D は変数です。
定数を強制的に変数として直接使用すると、エラーが報告されます: エラー内の
>>> 'A' = [] ...SyntaxError: can't assign to literal
literal
は literal## を参照しています。 # はコンピュータサイエンスにおける一般的な概念であり、
はソースコード内の固定値を表現するために使用されます。 たとえば、整数、浮動小数点数、文字列などの基本的な型はリテラルです。
# J 同学的解答 >>> list1 = ['A', 'B', 'C', 'D'] >>> for i in list1: >>> globals()[i] = [] >>> A []このメソッドは、グローバル名前空間を変更することで新しい変数を巧みに「定義」します。 globals() メソッドは辞書を取り出します。文字列「A」はキーの 1 つであり、このキーはまさにグローバル名前空間内の変数であり、定数から変数への変換を実現します。 データ構造レベルでは、空のリスト [] は値としてその文字列キー値にバインドされ、アプリケーション レベルでは変数の内容として変数名にバインドされます。 この回答を見て、先月、
動的変数代入に関する記事「Python 動的代入の罠」を再録したことを突然思い出しました。問題です。私は、globals() と locals() の使用法の違いだけに焦点を当てているようですが、それらの本来の使用法を実際には理解していません。
J のクラスメートは、その記事を読んだ直後にこの方法を知ったと言っていました。これは面白いもので、私が一生懸命飲み込んだ知識を共有すると、それがクラスメイトの J に吸収されて習得され、最終的にはフィードバックが戻ってきて問題が解決されました。 知識の共有の魅力を実感しています。知識は流れの中で命を吹き込み、衝突の中で輝きます。
同時に、私は相互支援学習グループの利点も本当に理解しています。他人に利益をもたらす人は自分自身にも利益をもたらし、お互いに助け合う人は一緒に進歩します。
3. コードを動的に実行する方法
Q (グループの新しいメンバー) は、別の答えを提供しました:# Q 同学的解答 >>> list1 = ['A', 'B', 'C', 'D'] >>> for i in list1: >>> exec(f"{i} = []") >>> A []him書き込みメソッドは、Python 3.6 で導入された f-strings 機能を使用します。実際、それより低いバージョンでも実装できます。必要なのは、exec() メソッドで受け取ったパラメータが、変数 i を含む文字列であることを確認することだけです。例 このように記述します:
# 以下代码可替换上例的第 4 行 exec(i + " = []") # 或者: exec("{} = []".format(i)) # 或者: exec(' '.join([i, '= []']))これらの書き方の違いは、文字列の結合方法の違いのみです。文字列の結合方法や各方法の違いについては、「7つの方法を詳しく解説」を参照してください。 Python で文字列を結合するには」 》。
Q 同学这个答案的核心在于 exec() 方法,它是内置的,用途是执行储存在字符串或文件中的代码段。
它的基础用法如下:
>>> exec('x = 1 + 2') >>> x 3 # 执行代码段 >>> 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 で文字列定数を変数に変換するにはどうすればよいですか? (例付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。