[英]Confusing scope in python with exec function
在 Python 中使用exec()
函數時,我遇到了這種令人困惑的行為。
代碼1:
def add(a, b):
exec("c = a+b")
print(locals())
return 1
add(3,4)
這打印
{'a': 3, 'b': 4, 'c': 7}
並按預期返回 1。 但是,如果我嘗試使用另一個名為c
的變量,它就不起作用。
代碼2:
def add(a, b):
exec("c = a+b")
print(locals())
c = 2
print(locals())
return 1
add(3,4)
Code2 打印
{'a': 3, 'b': 4}
{'a': 3, 'b': 4, 'c': 2}
並返回 1。有人可以向我解釋一下嗎?
它與內存分配以及 exec 如何運行有關。
首先,函數中的變量存儲在堆棧中,函數中所有變量的內存是在編譯字節碼時分配的(注意這並不意味着它們當時被賦予了值)。 如果您在函數中的某處定義變量“c”,它將在內存中分配一個空間。 如果您想從比我解釋得更好的人那里了解更多信息,我建議您查看這篇文章: 如何為 Python 中的變量分配內存?
其次, exec() 是動態運行的,不能編輯任何局部變量(查看文檔: https ://docs.python.org/3/library/functions.html#exec )。 動態意味着括號中的語句不會與函數的其余部分一起編譯為字節碼,而是在運行 exec 字節碼時編譯。 exec 函數可以創建局部變量但不能直接編輯它們,這包括尚未在作用域中聲明的變量,因為它們將分配內存(即使那里還沒有存儲值)。
最后,在 Code1 中,變量“c”沒有在 exec() 之外定義,所以當 exec 運行時,“c”被分配內存並被賦值。 但是在Code2中,“c”是在函數中定義的(即使是在exec()之后),所以在函數編譯成字節碼的時候會分配內存,也就是說exec函數運行時不會能夠更改“c”的值,因為它已經存在於內存中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.