溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python怎么將字符串常量轉(zhuǎn)化為變量

發(fā)布時(shí)間:2022-01-17 17:26:48 來(lái)源:億速云 閱讀:128 作者:iii 欄目:互聯(lián)網(wǎng)科技

本篇內(nèi)容主要講解“Python怎么將字符串常量轉(zhuǎn)化為變量”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Python怎么將字符串常量轉(zhuǎn)化為變量”吧!

1、如何動(dòng)態(tài)生成變量名?

M 同學(xué)的問(wèn)題如下:

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

簡(jiǎn)單理解,這個(gè)問(wèn)題的意思是,將字符串內(nèi)容作為其它對(duì)象的變量名。

list 中的元素是字符串,此處的 ‘A’-‘D’ 是常量 ,而在要求的結(jié)果中,A-D 是變量 。

如果強(qiáng)行直接將常量當(dāng)做變量使用,它會(huì)報(bào)錯(cuò):

 >>> 'A' = []

 ...SyntaxError: can't assign to literal

報(bào)錯(cuò)中的literal 指的是字面量 ,這是計(jì)算機(jī)科學(xué)中常見(jiàn)的一個(gè)概念,用于表達(dá)源代碼中的固定值。 例如,整數(shù)、浮點(diǎn)數(shù)、字符串等基本類型,就是字面量。

字面量指的就是一個(gè)量本身,可以理解為一種原子性的實(shí)體,當(dāng)然不能再被賦值了。

所以,取出的字符串內(nèi)容,并不能直接用作變量名,需要另想辦法。

有初學(xué)者可能會(huì)想,list[0] = [] 行不行?當(dāng)然不行,因?yàn)闆](méi)有出現(xiàn) A 。那 A = list[0] ,接著 A = [] 呢?那也不行,因?yàn)檫@里的 A 是你憑空定義出來(lái)的,而不是從已有條件中生成的。

當(dāng)時(shí),群里只有兩三個(gè)同學(xué)參與了討論,我們沒(méi)想到解決辦法。但是,我覺(jué)得這個(gè)題目很有意思,值得玩味。

因?yàn)?,如果能解決這個(gè)問(wèn)題,那就意味著可以不作預(yù)先定義,而是動(dòng)態(tài)地生成變量名,這不僅能減少給變量取名的麻煩,還實(shí)現(xiàn)了自動(dòng)編碼!

可以設(shè)想一下未來(lái),人工智能在編寫(xiě)代碼的時(shí)候,如果能根據(jù)已知條件,動(dòng)態(tài)生成變量名,那編寫(xiě)代碼的過(guò)程不就順利多了么?(據(jù)說(shuō),現(xiàn)在已經(jīng)有人工智能可以編寫(xiě)代碼了,不知它在取變量名時(shí),是用的什么方法?)

2、辦法總是有的

最近,學(xué)習(xí)群里蒙混進(jìn)來(lái)了幾個(gè)打廣告的,為此,我決定提高審核門檻,例如,用群里的問(wèn)題來(lái)作個(gè)考核。

萬(wàn)萬(wàn)沒(méi)想到的是,第一個(gè)被考核到的 Q 同學(xué),幾乎不假思索地就說(shuō)出了一個(gè)解決上述問(wèn)題的思路。而偏偏就是那么巧 ,幾乎在同時(shí),群內(nèi)的 J 同學(xué)給出了另外一個(gè)解決方法(他沒(méi)看到群內(nèi)的討論,而是看到了知識(shí)星球的記錄,才知道這個(gè)問(wèn)題的)。

也就是說(shuō),前一晚還以為無(wú)解的問(wèn)題,在第二天竟得到了兩種不同的解決方法!

那么,他們的答案是什么呢?

 

 # J 同學(xué)的解答

 >>> list1 = ['A', 'B', 'C', 'D']

 >>> for i in list1:

 >>> globals()[i] = []

 >>> A

 []

這個(gè)方法通過(guò)修改全局命名空間,巧妙地“定義”出了新的變量。globals() 方法取出來(lái)的是一個(gè)字典,字符串 ‘A’ 是其中一個(gè)鍵值(key),而這個(gè)鍵值恰恰是全局命名空間中的一個(gè)變量,這就實(shí)現(xiàn)了從常量到變量的轉(zhuǎn)化。

在數(shù)據(jù)結(jié)構(gòu)層面上,空列表 [] 作為一個(gè)值(value)跟它的字符串鍵值綁定在一起,而在運(yùn)用層面上,它作為變量?jī)?nèi)容而跟變量名綁定在一起。

3、動(dòng)態(tài)執(zhí)行代碼的方法

新進(jìn)群的 Q 同學(xué),提供了一個(gè)不同的答案:

 

 # Q 同學(xué)的解答

 >>> list1 = ['A', 'B', 'C', 'D']

 >>> for i in list1:

 >>> exec(f"{i} = []")

 >>> A

 []

他的寫(xiě)法用到了 Python 3.6 才引入的 f-strings 特性,事實(shí)上,在較低版本中,也是可以實(shí)現(xiàn)的,只需要保證 exec() 方法接收的參數(shù)是包含了變量 i 的字符串即可,例如這樣寫(xiě):

 

 # 以下代碼可替換上例的第 4 行

 exec(i + " = []")

 # 或者:

 exec("{} = []".format(i))

 # 或者:

 exec(' '.join([i, '= []']))

這幾種寫(xiě)法的區(qū)別只是字符串拼接法的區(qū)別,關(guān)于如何拼接字符串,以及不同方法之間的區(qū)別,可參看《詳解Python拼接字符串的七種方式》。

Q 同學(xué)這個(gè)答案的核心在于 exec() 方法,它是內(nèi)置的,用途是執(zhí)行儲(chǔ)存在字符串或文件中的代碼段。

它的基礎(chǔ)用法如下:

 >>> exec('x = 1 + 2')

 >>> x

 3

 

 # 執(zhí)行代碼段

 >>> s = """

 >>> x = 10

 >>> y = 20

 >>> sum = x + y

 >>> print(sum)

 >>> """

 >>> exec(s)

 30

看完了 exec() 的用法,我們?cè)倩貋?lái)看 Q 同學(xué)的答案。for-循環(huán)中取出來(lái)的 i 是字符串,而拼接后的字符串經(jīng)過(guò) exec() 的處理,就獲得了動(dòng)態(tài)編寫(xiě)代碼的效果。

也就是說(shuō),因?yàn)樽址A康膬?nèi)容被當(dāng)做有效代碼而執(zhí)行了,其中的 'A'-'D' 元素,就取得了新的身份,變成了最終的 A-D 變量名。

這個(gè)方法看起來(lái)很簡(jiǎn)單啊,可是由于 exec() 方法太生僻了,直到 Q 同學(xué)提出,我們才醒悟過(guò)來(lái)。

注意:在 Python3 中,exec() 是個(gè)內(nèi)置方法;而在 Python2 中,exec 是個(gè)語(yǔ)句(statement),另外有個(gè) execfile() 方法,兩者相合并,就成了 Python3 中的 exec() 方法。本文使用的是 Python3。

到此,相信大家對(duì)“Python怎么將字符串常量轉(zhuǎn)化為變量”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI