簡體   English   中英

python中的范圍與exec函數混淆

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM