1、如何動態生成變數名?
m 同學的問題如下:
打擾一下大家,請教個問題,已知 list = ['a', 'b', 'c', 'd'] , 如何才能得到以 list 中元素命名的新列表 a = , b = , c = , d = 呢?
簡單理解,這個問題的意思是,將字串內容作為其它物件的變數名。
list 中的元素是字串,此處的 『a』-『d』 是常量,而在要求的結果中,a-d 是變數。
如果強行直接將常量當做變數使用,它會報錯:
報錯中的literal 指的是字面量 ,這是電腦科學中常見的乙個概念,用於表達源**中的固定值。例如,整數、浮點數、字串等基本型別,就是字面量。
字面量指的就是乙個量本身,可以理解為一種原子性的實體,當然不能再被賦值了。
所以,取出的字串內容,並不能直接用作變數名,需要另想辦法。
有初學者可能會想,list[0] = 行不行?當然不行,因為沒有出現 a 。那 a = list[0] ,接著 a = 呢?那也不行,因為這裡的 a 是你憑空定義出來的,而不是從已有條件中生成的。
我覺得這個題目很有意思,值得玩味。因為,如果能解決這個問題,那就意味著可以不作預先定義,而是動態地生成變數名,這不僅能減少給變數取名的麻煩,還實現了自動編碼!
可以設想一下未來,人工智慧在編寫**的時候,如果能根據已知條件,動態生成變數名,那編寫**的過程不就順利多了麼?(據說,現在已經有人工智慧可以編寫**了,不知它在取變數名時,是用的什麼方法?)
2、辦法總是有的
這個方法通過修改全域性命名空間,巧妙地「定義」出了新的變數。globals() 方法取出來的是乙個字典,字串 『a』 是其中乙個鍵值(key),而這個鍵值恰恰是全域性命名空間中的乙個變數,這就實現了從常量到變數的轉化。
在資料結構層面上,空列表 作為乙個值(value)跟它的字串鍵值繫結在一起,而在運用層面上,它作為變數內容而跟變數名繫結在一起。
看到這個回答的時候,我就突然想起來一篇文章,講的正是動態地進行變數賦值的問題啊!我似乎只關注了 globals() 與 locals() 用法的區別,卻沒有真正地掌握它們的原初用途。
j 同學說,他正是看了那篇文章,才學得了這個方法。這就有意思了,我分享了乙個自己囫圇吞棗的知識,然後它被 j 同學吸收掌握,最後反饋回來解決了我的難題。
我真切地感受到了知識分享的魅力:知識在流動中獲得生命,在碰撞中鋥亮色澤。
同時,我也真切地明白了乙個互助的學習團體的好處:利人者也利己,互助者共同進步。
3、動態執行**的方法
q 同學提供了乙個不同的答案:
他的寫法用到了 python 3.6 才引入的 f-strings 特性,事實上,在較低版本中,也是可以實現的,只需要保證 exec() 方法接收的引數是包含了變數 i 的字串即可,例如這樣寫:
這幾種寫法的區別只是字串拼接法的區別
q 同學這個答案的核心在於 exec() 方法,它是內建的,用途是執行儲存在字串或檔案中的**段。
它的基礎用法如下:
看完了 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高階 如何將字串常量轉化為變數?
前幾天,我們python貓交流學習群裡的 m 同學提了個問題。這個問題挺有意思,經初次討論,我們認為它無解。然而,我認為它很有價值,應該繼續思考怎麼解決,所以就在私密的知識星球上記錄了下來。萬萬沒想到的是,在第二天,有兩位同學接連給出了解決方法!由此,群內出現了一輪熱烈的技術交流。m 同學的問題如下...
如何將字串反轉
今天看看某某童鞋的部落格看到他寫的一題,如何將字串反轉,結果一看就感覺,既然客戶端可以完成,就用js。於是第一想法,將字串拆成陣列嘛,然後反轉,然後再join 組合嘛,這不就o了,於是立即下手 儘管還在複習可憐的固體物理,哎。var teststring document.getelementbyi...
如何將字串反轉?
1.stringbuilder的reverse 方法,最簡單 public static string reverse4 string s 2.使用字串陣列,實現從尾部開始逐個逆序放入字串 public static string reverse3 string s 3.使用string的chara...