2016-11-21 56 views
1

如果我將城市列表作爲變量傳遞,那麼任務按預期完成。Python - 乾淨地傳遞參數

def count_top_rt(tweet_set): 
    for tweet in tweet_set: 
     print(tweet) 

tweet_set = ["Sydney", "London", "Paris"] 
print(tweet_set) 

如果我錯類型的函數定義參數名稱,則任務完成還,因爲tweet_set變量是全球性的。

def count_top_rt(mis_typed_arguament): 
    for tweet in tweet_set: 
     print(tweet) 

tweet_set = ["Sydney", "London", "Paris"] 
print(tweet_set) 

感覺好像沒有正確傳遞參數是錯誤的。我有兩個問題:

  • 在第一個版本中,參數是否正確傳遞?
  • 我可以確保正確傳遞參數的方式是什麼?
+5

對於全局變量,不要使用與局部變量相同的名稱。那麼這個問題就不會發生。 – kindall

+0

如果您使用PyCharm或類似的IDE,它會告訴您何時自動執行此操作。 – Alex

+1

@kindall第二個函數的問題不在於他爲全局和本地使用了相同的名稱,而是因爲'for'循環沒有使用它應該使用的局部變量。 – Barmar

回答

3

參數是否正確傳遞?

是的,參數在第一個示例中正確傳遞:您的例程僅依賴於輸入參數。

什麼方式

在模塊化的理念,爲您不能有效地防止這樣的問題:你的功能不允許知道什麼外部。這就是「純粹」模塊化編程和Python特性有點不一致的地方。

作爲一名程序員,確保這一點的方法是使用不易碰撞的變量名稱。在這種情況下,請將測試驅動程序(您的主程序)中的名稱tweet_set更改爲其他名稱。如果這是一個常規測試用例,請使用不太可能出現在函數中的名稱,例如TEST_DRIVER_tweet_set

編程實踐

您可以使用搜索功能,在編輯器中選擇顯示的每個名字的所有地方。如果依次突出顯示每個參數和變量名稱並「查找所有」,則可以看到哪些字符沒有正確輸入。

先進技術 ...只是讓你知道的「有一天」 ......

有Python的功能,讓功能看進棧,抓住下一個函數的棧幀(一個叫這個),並檢查它的活動變量。如果您確實需要這樣做,您可以讓函數根據每個堆棧幀中的變量名稱檢查自己的參數名稱,直到操作系統中的主程序。

很少有情況下這是有用的。

2

有檢查的一個簡單的方法:

>>> def count_top_rt(tweet_set): 
...  print(id(tweet_set)) 
...  for tweet in tweet_set: 
...    print(tweet) 

>>> tweet_set = ["Sydney", "London", "Paris"] 
>>> count_top_rt(tweet_set) 
1951490534472 
Sydney 
London 
Paris 
>>> id(tweet_set) 
1951490534472 

>>> tweet_set2 = ["Sydney", "London", "Paris"] 
>>> count_top_rt(tweet_set2) 
1951490565832 
Sydney 
London 
Paris 
>>> id(tweet_set2) 
1951490565832 

,你可以看到,當一個變量作爲變量傳遞,局部變量變成reference它,不管名稱是什麼的全球。這是因爲解釋器首先到本地堆棧檢查變量(它是一個引用的原因是因爲函數參數的行爲),然後才引用全局變量。

1

防止出現這種情況的最好方法是避免全局變量。將所有代碼放入函數和類中。

def count_top_rt(tweet_set): 
    for tweet in tweet_set: 
     print(tweet) 

def main(): 
    tweet_set = ["Sydney", "London", "Paris"] 
    count_top_rt(tweet_set) 

main() 

,如果你在​​定義拼錯了參數名稱,這將拋出一個NameError