2016-11-21 46 views
-1

我在Python中運行一個非常簡單的例子,但我得到一些錯誤。 當我運行這段代碼:Python中的最小/最大函數的參數數量的錯誤

lst = [1, 3, 4, 6, 7] 
maxLSt = max(lst) 
print(maxLSt) 

我得到這個錯誤:

maxLSt = max(lst) 
    TypeError: max() takes exactly 2 arguments (1 given) 

是什麼這個問題的原因是什麼?

+6

你掩蓋'max'更早。 – TigerhawkT3

+0

你的代碼很好,內置'max'函數。看起來,你已經以某種方式綁定了與該名稱不同的功能。這是該腳本中唯一的代碼,還是在腳本中有其他函數定義?或者腳本是否包含任何'來自somemodule import *'語句? –

+0

你是直接在解釋器中輸入代碼嗎?如果是這樣,你應該關閉它並重新啓動,因爲除了'max'之外,你可能已經搞混了其他的東西。 :)但是,您可以通過執行'max = __builtins __。max'來恢復當前會話中的原始'max' ......除非您還屏蔽了__builtins__'。 –

回答

1

當你做

from audioop import max 

你明確告訴Python的這個名字maxmaxaudioop。你不可能有一個名稱引用兩種不同的東西,所以內置的max函數變得被audioop的函數「掩蓋」或「隱藏」。掩碼的函數對象仍然可以通過其全名__builtins__.max進行訪問,但我們通常避免使用內建對象的全名,因爲它們只是使代碼顯得雜亂無章,但它們在緊急情況和其他特殊情況下非常方便。

以避免名稱衝突這樣的方式是使用import語句的簡單形式:

import audioop 

,然後您可以訪問它的使用完全合格的名稱audioop.maxmax功能。如果你想從一個模塊經常使用的名稱和不想鍵入它的全名所有的時間,你可以給該模塊的簡稱,當你導入它,如:

import audioop as au 

然後你會請參考au.maxmax函數。


我建議您閱讀官方Python教程中Python Scopes and Namespaces的章節。事實上,閱讀整個教程是一個好主意。它不針對那些完全不熟悉編程的人,它假定你已經有了一些編程經驗(最好在C/C++/Java系列中),所以你不應該覺得它太簡單。 :)

我還建議您閱讀這篇文章:Facts and myths about Python names and values,這是由SO老將Ned Batchelder寫的。這是對Python數據模型的一個很好的解釋,它與你在Java中使用的數據模型完全不同。這些基本思想的簡要總結以及很好的圖表可以在Other languages have "variables", Python has "names"找到。

+1

精彩! 現在我明白了爲什麼人們警告我要小心不需要的進口模塊!非常感謝你的解釋! 我認爲避免這種東西的初學者最好的方式是非常小心地使用Pydev代碼推薦編輯器! 我猜,我使用編輯推薦的「最大」功能,我對此並不注意!謝謝! –

0

你的代碼工作正常。這是整個程序還是它的一部分?如果這樣提供整個代碼。 在情況下,如果它的整個程序,你應該嘗試Restarting your Kernel.

+0

是的,謝謝! 問題是這條不想要的進口東西: from audioop import最大 我不知道Python無法處理忽略導入的不需要的庫,現在在代碼中使用! 我是java程序員,一週前剛剛啓動Python。 Python和Java在這些東西之間有什麼區別? –

+0

這是我在網上找到的一個卸載導入的,試試下面的代碼: –

+0

這是我在網上找到的一個卸載導入的東西, –

0

這是我剛剛找到在互聯網上卸載進口,希望這會做的伎倆

import gc, sys 

print len(gc.get_objects()) 

# Attempt to unload the module 

import audioop 
del sys.modules["audioop"] 
audioop = None 

gc.collect() 
print len(gc.get_objects()) 
+0

在Python中卸載已加載的模塊相當罕見,正如註釋所示,嘗試可能不會成功。我想這在調試時很有用(儘管嘗試重新加載模塊的更改版本通常會更有用)。對於OP的情況,最好的選擇是簡單地加載模塊,以避免發生名稱衝突。 –