[英]how python interpreter treats the position of the function definition having default parameter
為什么第一個代碼輸出51 ,第二個代碼輸出21 。 我理解第二個代碼應該是output 21,但是按照我的理解,第一個代碼應該也是output 21(b的值變成20然后是調用ZC1C425268E68385D1AB5074FC)。 我錯過了什么?
b = 50
def f(a, b=b):
return a + b
b = 20
print(f(1))
Output:51
b = 50
b = 20
def f(a, b=b):
return a + b
print(f(1))
Output:21
編輯:這與如何在 Python 2.7 中更改可選 function 參數的默認值不同? 因為這里討論的是對默認參數的無意更改,而不是如何有意更改默認參數的值,即這里的問題集中在 python 解釋器如何處理 ZC1C425268E68385D1AB5074F 的 position 定義具有默認參數的函數的 position。
python 初學者的提示:如果您使用像 pycharm 這樣的 IDE - 您可以放置一個調試器並查看變量發生了什么。
我們可以使用id(b)
更好地理解發生了什么,它為我們提供了 memory 中特定 object 的地址:
返回 object 的“身份”。 這是一個 integer,保證在此 object 在其生命周期內是唯一且恆定的。 具有非重疊生命周期的兩個對象可能具有相同的id()值。
CPython實現細節:這是memory中object的地址。
讓我將您的代碼修改為以下內容:
b = 50
print("b=50 :", id(b))
def f(a, b=b):
print("b in the function f :", id(b))
print(id(b))
return a + b
b = 20
print("b=20 :", id(b))
print(f(1))
output如下:
b=50 : 4528710960
b=20 : 4528710000
b in the function f : 4528710960
4528710960
51
如您所見,function 中的b
和b=50
具有相同的地址。
當您執行b=20
時,會創建一個新的 object。
在 Python 中,(幾乎)一切都是 object。 我們在 Python 中通常所說的“變量”更恰當地稱為名稱。 同樣,“賦值”實際上是將名稱綁定到 object。 每個綁定都有一個 scope 定義其可見性,通常是名稱起源的塊。
在 python
當你這樣做
b=50
a binding
b到 int object在塊的 scope中創建
當我們稍后說b=20
時, int object b=50
不受影響。 這兩者本質上是兩個不同的對象。
您可以在這些鏈接中閱讀有關它的更多信息。
想想口譯員是如何處理這個問題的。 在第一種情況下, def f(a, b=b)
被解釋為def f(a, b=50)
因為當前 scope 中b
的值為50
。 因此, f(1)
將a
分配給1
,因此a + b
= 1 + 50 = 51 。
同樣,在第二種情況下,當前 scope 中b
的值在聲明 function 時為 20,因此定義解釋為def f(a, b=20)
。 因此, f(1)
= 21 。
function 的不同放置導致不同錯誤的原因也是因為值“b”的放置。
由於 function 'f' 使用命名參數 'b',因此它將變量 'b' 作為參數/參數的第一個賦值給 function 'f'
例如,
b = 50
def f(a, b=b):
return a + b
b = 20
print(f(1))
正如您所指出的,這導致 output 51
但是,如果我將代碼更改為
def f(a, b=b):
return a + b
b = 50
b = 20
print(f(1))
這將導致以下錯誤:
def f(a, b=b):
NameError: name 'b' is not defined
因此,我們可以推斷出作為 function 的命名參數的變量的放置導致了輸出的差異。
您也可以使用全局變量。
因為當您在案例 1 中定義 function f
時,您正在將b
的值(當時為50
)分配給 function 的第二個參數。
而在情況 2 中,在將b
的值分配給f
的第二個參數時,它是20
。
這就是兩種情況下答案不同的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.