[英]What happens when I reassign the mutable default argument inside a function?
[英]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_count
在print_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_line
, current_line
和current_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_count
和f
,並將語句指針移回到之前保存的位置。 然后在調用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=3
, current_line
是一個局部變量。 方法print_a_line
和變量current_file
是全局的,這就是main
可以使用它們的原因。 在print_a_line
,您有局部變量line_count
和f
,它們分別與current_line
和current_file
相同。 但是,因為current_line
是main
本地,而line_count
是print_a_line
本地,所以current_line == line_count
沒有將其評估為True
。
這樣做絕對不是一件壞事 - 相同的值可能意味着不同范圍內的不同事物,變量的名稱應該反映這一點。
閱讀其他人推薦的地方。 在定義和調用函數時使用不同的名稱並不是一件壞事; 事實上,我會推薦它,直到你掌握了范圍和所有這些。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.