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

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

熱門話題

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

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

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

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

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

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

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

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