在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

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

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

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

>>>a
{'c': 2}

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

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

>>>a
{}

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

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

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

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

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

exec(f"b = 'c'") 

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

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

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

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

相當(dāng)于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