首頁 後端開發 Python教學 Python如何將字串常數轉換為變數? (附範例)

Python如何將字串常數轉換為變數? (附範例)

Mar 18, 2019 am 10:15 AM
python


本篇文章帶給大家的內容是關於Python如何將字串常數轉換為變數? (附範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

本文將相關的內容要點作了梳理,並由此引申到更進一步的學習話題,希望對你有所幫助。

1、如何動態產生變數名稱?

M 同學的問題如下:

打擾一下大家,請教一個問題,已知list = ['A', 'B', 'C', 'D'] , 如何才能得到以list 中元素命名的新列表A = [], B = [], C = [], D = [] 呢?

簡單理解,這個問題的意思是,將字串內容作為其它物件的變數名。

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')
>>> 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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

mysql 是否要付費 mysql 是否要付費 Apr 08, 2025 pm 05:36 PM

MySQL 有免費的社區版和收費的企業版。社區版可免費使用和修改,但支持有限,適合穩定性要求不高、技術能力強的應用。企業版提供全面商業支持,適合需要穩定可靠、高性能數據庫且願意為支持買單的應用。選擇版本時考慮的因素包括應用關鍵性、預算和技術技能。沒有完美的選項,只有最合適的方案,需根據具體情況謹慎選擇。

mysql安裝後怎麼使用 mysql安裝後怎麼使用 Apr 08, 2025 am 11:48 AM

文章介紹了MySQL數據庫的上手操作。首先,需安裝MySQL客戶端,如MySQLWorkbench或命令行客戶端。 1.使用mysql-uroot-p命令連接服務器,並使用root賬戶密碼登錄;2.使用CREATEDATABASE創建數據庫,USE選擇數據庫;3.使用CREATETABLE創建表,定義字段及數據類型;4.使用INSERTINTO插入數據,SELECT查詢數據,UPDATE更新數據,DELETE刪除數據。熟練掌握這些步驟,並學習處理常見問題和優化數據庫性能,才能高效使用MySQL。

如何針對高負載應用程序優化 MySQL 性能? 如何針對高負載應用程序優化 MySQL 性能? Apr 08, 2025 pm 06:03 PM

MySQL數據庫性能優化指南在資源密集型應用中,MySQL數據庫扮演著至關重要的角色,負責管理海量事務。然而,隨著應用規模的擴大,數據庫性能瓶頸往往成為製約因素。本文將探討一系列行之有效的MySQL性能優化策略,確保您的應用在高負載下依然保持高效響應。我們將結合實際案例,深入講解索引、查詢優化、數據庫設計以及緩存等關鍵技術。 1.數據庫架構設計優化合理的數據庫架構是MySQL性能優化的基石。以下是一些核心原則:選擇合適的數據類型選擇最小的、符合需求的數據類型,既能節省存儲空間,又能提升數據處理速度

HadiDB:Python 中的輕量級、可水平擴展的數據庫 HadiDB:Python 中的輕量級、可水平擴展的數據庫 Apr 08, 2025 pm 06:12 PM

HadiDB:輕量級、高水平可擴展的Python數據庫HadiDB(hadidb)是一個用Python編寫的輕量級數據庫,具備高度水平的可擴展性。安裝HadiDB使用pip安裝:pipinstallhadidb用戶管理創建用戶:createuser()方法創建一個新用戶。 authentication()方法驗證用戶身份。 fromhadidb.operationimportuseruser_obj=user("admin","admin")user_obj.

Navicat查看MongoDB數據庫密碼的方法 Navicat查看MongoDB數據庫密碼的方法 Apr 08, 2025 pm 09:39 PM

直接通過 Navicat 查看 MongoDB 密碼是不可能的,因為它以哈希值形式存儲。取回丟失密碼的方法:1. 重置密碼;2. 檢查配置文件(可能包含哈希值);3. 檢查代碼(可能硬編碼密碼)。

mysql 需要互聯網嗎 mysql 需要互聯網嗎 Apr 08, 2025 pm 02:18 PM

MySQL 可在無需網絡連接的情況下運行,進行基本的數據存儲和管理。但是,對於與其他系統交互、遠程訪問或使用高級功能(如復制和集群)的情況,則需要網絡連接。此外,安全措施(如防火牆)、性能優化(選擇合適的網絡連接)和數據備份對於連接到互聯網的 MySQL 數據庫至關重要。

mysql workbench 可以連接到 mariadb 嗎 mysql workbench 可以連接到 mariadb 嗎 Apr 08, 2025 pm 02:33 PM

MySQL Workbench 可以連接 MariaDB,前提是配置正確。首先選擇 "MariaDB" 作為連接器類型。在連接配置中,正確設置 HOST、PORT、USER、PASSWORD 和 DATABASE。測試連接時,檢查 MariaDB 服務是否啟動,用戶名和密碼是否正確,端口號是否正確,防火牆是否允許連接,以及數據庫是否存在。高級用法中,使用連接池技術優化性能。常見錯誤包括權限不足、網絡連接問題等,調試錯誤時仔細分析錯誤信息和使用調試工具。優化網絡配置可以提升性能

mysql 需要服務器嗎 mysql 需要服務器嗎 Apr 08, 2025 pm 02:12 PM

對於生產環境,通常需要一台服務器來運行 MySQL,原因包括性能、可靠性、安全性和可擴展性。服務器通常擁有更強大的硬件、冗餘配置和更嚴格的安全措施。對於小型、低負載應用,可在本地機器運行 MySQL,但需謹慎考慮資源消耗、安全風險和維護成本。如需更高的可靠性和安全性,應將 MySQL 部署到雲服務器或其他服務器上。選擇合適的服務器配置需要根據應用負載和數據量進行評估。

See all articles