3 回答

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超8個(gè)贊
Python是強(qiáng)有力的動(dòng)態(tài)類型。
強(qiáng)類型意味著值的類型不會(huì)以意外的方式改變。只包含數(shù)字的字符串不會(huì)神奇地變成一個(gè)數(shù)字,就像Perl中可能發(fā)生的那樣。每種類型的更改都需要顯式轉(zhuǎn)換。
動(dòng)態(tài)類型意味著運(yùn)行時(shí)對(duì)象(值)具有類型,而不是靜態(tài)類型,其中變量具有類型。
至于你的例子
bob = 1bob = "bob"
這是因?yàn)樽兞繘](méi)有類型; 它可以命名任何對(duì)象。之后bob=1
,你會(huì)發(fā)現(xiàn)type(bob)
返回int
,但之后bob="bob"
,它會(huì)返回str
。(注意,這type
是一個(gè)常規(guī)函數(shù),因此它會(huì)計(jì)算其參數(shù),然后返回值的類型。)
與舊的C語(yǔ)言形成鮮明對(duì)比,后者是弱的,靜態(tài)類型的,因此指針和整數(shù)幾乎可以互換。(在許多情況下,現(xiàn)代ISO C需要轉(zhuǎn)換,但默認(rèn)情況下我的編譯器對(duì)此仍然寬容。)
我必須補(bǔ)充一點(diǎn),強(qiáng)類型和弱類型更像是一個(gè)連續(xù)體而不是布爾選擇。C ++具有比C更強(qiáng)的類型(需要更多轉(zhuǎn)換),但是類型系統(tǒng)可以通過(guò)使用指針強(qiáng)制轉(zhuǎn)換來(lái)破壞。
動(dòng)態(tài)語(yǔ)言(如Python)中類型系統(tǒng)的強(qiáng)度實(shí)際上取決于其原語(yǔ)和庫(kù)函數(shù)如何響應(yīng)不同類型。例如,+
重載是因?yàn)樗m用于兩個(gè)數(shù)字或兩個(gè)字符串,但不是字符串和數(shù)字。這是在+
實(shí)現(xiàn)時(shí)所做的設(shè)計(jì)選擇,但從語(yǔ)言的語(yǔ)義開(kāi)始并不是必需的。實(shí)際上,當(dāng)您+
在自定義類型上重載時(shí),可以將其隱式轉(zhuǎn)換為數(shù)字:
def to_number(x): """Try to convert x to a number.""" if x is None: return 0 # more special cases here else: return float(x) # works for numbers and stringsclass Foo(object): def __add__(self, other): other = to_number(other) # now do the addition
(我所知道的唯一一種完全強(qiáng)類型,也就是嚴(yán)格類型的語(yǔ)言是Haskell,其中類型是完全不相交的,只有通過(guò)類型類才可以控制形式的重載。)

TA貢獻(xiàn)1845條經(jīng)驗(yàn) 獲得超8個(gè)贊
您將'強(qiáng)類型'與'動(dòng)態(tài)類型'混淆。
我無(wú)法1
通過(guò)添加字符串來(lái)更改類型'12'
,但我可以選擇存儲(chǔ)在變量中的類型,并在程序運(yùn)行時(shí)更改它。
與動(dòng)態(tài)類型相反的是靜態(tài)類型; 變量類型的聲明在程序的生命周期內(nèi)不會(huì)改變。強(qiáng)類型的反面是弱打字; 值的類型可以在程序的生命周期中更改。
添加回答
舉報(bào)