簡體   English   中英

python 解釋器如何處理具有默認參數的 function 定義的 position

[英]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 中的bb=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.

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