簡體   English   中英

當我在函數中傳遞一個完全不同的參數名稱時會發生什么?

[英]What happens when I pass a totally different argument name in a function?

假設我有這個功能:

def print_a_line(line_count, f):
    print line_count, f.readline()

我叫它:

current_line = 3
print_a_line(current_line, current_file)

現在發生了什么? line_count = 3還是line_count = current_line = 3?

另外,如果我傳遞不同的參數名稱(比如我在這里使用current_line而不是line_count?),這是一件壞事嗎?

現在發生了什么? line_count = 3還是line_count = current_line = 3?

line_countprint_a_line的調用中綁定到3。 變量current_line不受調用的影響。

另外,如果我傳遞不同的參數名稱(比如我在這里使用current_line而不是line_count?),這是一件壞事嗎?

這根本不是壞事。 您正在使用位置參數而不是命名參數。

在Python中,有兩種參數:位置參數和命名參數。 聲明為上面的print_a_line函數的函數僅使用位置參數。 只有命名參數的函數可能看起來像

def print_a_line_2(line_count=3, f=None):
    if f is not None:
        print line_count, f.readline()

具有位置和命名參數的函數可能看起來像

def print_a_line_2(line_count, f, append_newline=True):
    if append_newline:
        print line_count, f.readline()
    else:
        print line_count, f.readline(),

位置參數被稱為位置的原因是只有你傳遞的參數的位置才重要。 因此,您可以將您喜歡的任何兩個表達式作為print_a_line的參數print_a_line ,並且首先傳遞的參數將綁定到line_count ,並且在執行print_a_line期間,第二個傳遞的參數將綁定到f

對於命名參數 ,情況並非如此,但語法不同。 要傳遞命名參數,可以編寫name=expression而不是簡單地編寫expression 所以,要調用print_a_line_2 ,你可以寫

print_a_line_2(line_count=3, f=current_file)

並且參數的名稱來自等號之前的內容,而不是等號之后的內容。

有關命名和位置參數的更多信息,我建議您查看Python教程

編輯 :每當你調用line_count(current_line, current_file)時會發生什么

Python解釋器維護有關程序的若干信息,它維護的一些重要事項是符號表,它將名稱(變量)綁定到它們的值,以及當前語句指針。 每當當前語句指針到達該行時

print_a_line(current_line, current_file)

Python解釋器在符號表中查找print_a_linecurrent_linecurrent_file 它發現print_a_line綁定到您在問題中定義的函數, current_line綁定到3,並且current_file綁定到文件對象(這是一個大的實現定義的數據結構,為了便於表示我' ll調用F,大寫字母F區別於小寫字母f我們將稍微相遇)。 由於print_a_line是一個函數,解釋器使用參數3和F調用函數。為此,它保存當前的執行狀態,將變量line_count綁定到符號表中的3和f到F,並將當前語句指針移動到print_a_line函數的第一行,即

print line_count, f.readline()

然后它執行內置的print語句的方式與執行原始函數調用的方式非常相似,查找符號表中的所有變量,並以與整個函數調用相同的方式調用f.readline()函數。 to print_a_line 然后,當print_a_line函數返回時,Python解釋器從符號表中刪除line_countf ,並將語句指針移回到之前保存的位置。 然后在調用print_a_line之后繼續執行代碼行。

你混淆了范圍。 我們假設您的文件如下所示:

def print_a_line(line_count, f):
    print line_count, f.readline()

def main():
    current_line = 3
    print_a_line(current_line, current_file)

if __name__ == "__main__":
    current_file = open('file.txt')
    main()

main ,你有current_line=3current_line是一個局部變量。 方法print_a_line和變量current_file是全局的,這就是main可以使用它們的原因。 print_a_line ,您有局部變量line_countf ,它們分別與current_linecurrent_file相同。 但是,因為current_linemain本地,而line_countprint_a_line本地,所以current_line == line_count沒有將其評估為True

這樣做絕對不是一件壞事 - 相同的值可能意味着不同范圍內的不同事物,變量的名稱應該反映這一點。

閱讀其他人推薦的地方。 在定義和調用函數時使用不同的名稱並不是一件壞事; 事實上,我會推薦它,直到你掌握了范圍和所有這些。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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