ホームページ  >  記事  >  バックエンド開発  >  Python で文字列定数を変数に変換するにはどうすればよいですか? (例付き)

Python で文字列定数を変数に変換するにはどうすればよいですか? (例付き)

不言
不言転載
2019-03-18 10:15:093836ブラウズ


この記事では、Python で文字列定数を変数に変換する方法について説明します。 (例もあり)ある程度の参考になるので、困っている友達は参考にしていただければ幸いです。

この記事では、関連する内容のポイントを整理し、さらなる学習トピックに拡張しています。

1. 変数名を動的に生成するにはどうすればよいですか?

M 人の学生の質問は次のとおりです:

すみません、質問したいのですが、リスト = ['A', 'B', 'C', 'D' ]、どうすればよいでしょうか?リスト内の要素にちなんで名付けられた新しいリスト A = []、B = []、C = []、D = [] を取得するのはどうでしょうか?

簡単に理解するには、この質問の意味は、文字列の内容を他のオブジェクトの変数名として使用することです。

リスト内の要素は文字列であり、ここでの「A」~「D」は定数であり、必要な結果の A~D は変数です。

定数を強制的に変数として直接使用すると、エラーが報告されます: エラー内の

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

literalliteral## を参照しています。 # はコンピュータサイエンスにおける一般的な概念であり、 はソースコード内の固定値を表現するために使用されます。 たとえば、整数、浮動小数点数、文字列などの基本的な型はリテラルです。

リテラルとは、原子の実体として理解できる量そのものを指しますが、もちろん値を割り当てることはできません。

したがって、取得した文字列の内容を変数名として直接使用することはできないため、別のメソッドを見つける必要があります。

初心者の中には、list[0] = [] で大丈夫なのでしょうか?と疑問に思う人もいるかもしれません。 Aは登場しないので、もちろんそうではありません。 A = list[0] の場合、A = [] はどうでしょうか?それはうまくいきません。なぜなら、ここでの A は、既存の条件から生成されるものではなく、何もないところからあなたによって定義されるからです。

当時、議論に参加した学生はグループ内で 2 ~ 3 人だけで、解決策は考えられませんでした。しかし、このテーマは非常に興味深いものであり、検討する価値があると思います。

なぜなら、この問題が解決できれば、変数名を事前定義ではなく動的に生成できることになり、変数名の手間が軽減されるだけでなく、自動コーディングも可能になるからです。

未来を想像することができます。人工知能がコードを書くときに、既知の条件に基づいて変数名を動的に生成できれば、コードを書くプロセスはよりスムーズになるのではないでしょうか? (人工知能がコードを書けるようになったと言われていますが、変数に名前を付けるときはどのような方法を使っているのでしょうか?)

2. 方法は常にあります

最近、学習する数人の広告主が、そこで、グループ内で質問をして評価するなど、復習の基準を高くすることにしました。

私が予想もしなかったのは、最初に評価された学生 Q が、ほとんど何も考えずに上記の問題を解決するアイデアを思いついたということでした。ところが、なんと偶然ですが、ほぼ同じタイミングで、グループの同級生のJ君が別の解決策を思いつきました(彼はグループでの議論は見ていなかったのですが、ナレッジプラネットの記録を見て初めてこの問題を知りました)。

言い換えれば、前の晩には解決できないと思った問題が、翌日には実際に 2 つの異なる解決策を得たということです。

それで、彼らの答えは何でしょうか?

# 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 サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。