鍍金池/ 問答/Python  網(wǎng)絡(luò)安全/ 內(nèi)置函數(shù)exec執(zhí)行字符串結(jié)果與預期不符

內(nèi)置函數(shù)exec執(zhí)行字符串結(jié)果與預期不符

>>>a = {}
>>>b = 'c'
>>>a[b] = 2

>>>a
{'c': 2}

執(zhí)行上面語句正常賦值,換做是用exec執(zhí)行字符串

>>>exec(f"a = {{}}")    #賦值成功
>>>exec(f"b = 'c'")    #賦值成功
>>>exec(f"{a}[] = 2")    #無報錯,但a的值沒有發(fā)生變化

>>>a
{}

求問為什么會這樣,有時候exec執(zhí)行其他字符串同樣會出現(xiàn)NameError等未定義的情況,請教下如何把上面的exec語句改成符合預期的語句

回答
編輯回答
執(zhí)念

分兩塊分析,
第一塊,f-string 字符串格式化
第二塊,exec函數(shù)

exec(f"a = {{}}") 

相當于exec("a = {}"), 執(zhí)行后a為{}

exec(f"b = 'c'") 

執(zhí)行后b為'c'

exec(f"{a}[] = 2") 

相當于exec("{}[{c}] = 2"), 那么就產(chǎn)生2個問題了:
第一,c沒有定義會報NameError: name 'c' is not defined
第二,添加的對象是{}而不是a,a也就不會變。
應(yīng)修改成

exec(f"a[''] = 2")

相當于exec(f"a['c'] = 2")

最后題外話,不推薦使用exec,尤其exec里還是f-string。

2017年12月27日 02:16
編輯回答
乞許

沒太懂啥意思問題啥意思

>>> exec("a={}")
>>> exec("b='c'")
>>> exec("a[b]=2")

clipboard.png

2017年8月5日 22:43