我遇到过一些链接,上面说Python是一种强类型语言。
然而,我认为在强类型语言中你不能这样做:
bob = 1
bob = "bob"
我认为强类型语言在运行时不接受类型更改。也许我对强/弱类型的定义是错误的(或过于简单)。
那么,Python是强类型语言还是弱类型语言呢?
我遇到过一些链接,上面说Python是一种强类型语言。
然而,我认为在强类型语言中你不能这样做:
bob = 1
bob = "bob"
我认为强类型语言在运行时不接受类型更改。也许我对强/弱类型的定义是错误的(或过于简单)。
那么,Python是强类型语言还是弱类型语言呢?
当前回答
TLDR;
Python类型是动态的,所以你可以将字符串变量更改为int(在静态语言中你不能)
x = 'somestring'
x = 50
Python类型是强的,所以你不能合并类型:
'foo' + 3 --> TypeError: cannot concatenate 'str' and 'int' objects
在弱类型Javascript中,这种情况会发生……
'foo'+3 = 'foo3'
关于类型推断
有些语言(如Java)强制显式声明对象类型
int x = 50;
像Kotlin这样的其他人只是从值本身推断它是一个int型
x = 50
但是因为这两种语言都使用静态类型,x不能从int型改变。两种语言都不允许像这样的动态变化
x = 50
x = 'now a string'
其他回答
现有的答案大多同意Python是一种强类型语言,因为它不会隐式地将值从一种类型转换为另一种类型。这些答案提到了将字符串添加到整数的情况来支持这种说法;"foo" + 3在Python中引发TypeError,而在Javascript(通常被认为是弱类型语言)中,数字3隐式转换为字符串,然后连接,因此结果是字符串"foo3"。
但在其他一些情况下,Python确实会执行隐式类型转换:
# implicit conversion from int to float
1 + 1.0
# implicit conversion from list to bool
if []: pass
相比之下,f#(通常被认为是强类型语言)不允许这两种:
1 + 1.0;;
----^^^
error FS0001: The type 'float' does not match the type 'int'
if [] then 1 else 2;;
---^^
error FS0001: This expression was expected to have type bool but here has type 'a list
因此,“强类型”和“弱类型”语言并没有严格的二分法,相反,我们可以说Python比Javascript更强类型,但没有f#强类型。
这个问题已经回答过几次了,但Python是一种强类型语言:
>>> x = 3
>>> y = '4'
>>> print(x+y)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'
JavaScript代码:
var x = 3
var y = '4'
alert(x + y) //Produces "34"
这就是弱类型和强类型的区别。弱类型自动尝试从一种类型转换为另一种类型,这取决于上下文(例如Perl)。强类型从不隐式转换。
您的困惑在于误解了Python如何将值绑定到名称(通常称为变量)。
在Python中,名称没有类型,所以你可以这样做:
bob = 1
bob = "bob"
bob = "An Ex-Parrot!"
名字可以绑定到任何东西上:
>>> def spam():
... print("Spam, spam, spam, spam")
...
>>> spam_on_eggs = spam
>>> spam_on_eggs()
Spam, spam, spam, spam
欲进一步阅读:
https://en.wikipedia.org/wiki/Dynamic_dispatch
还有稍微相关但更高级的:
http://effbot.org/zone/call-by-object.htm
根据这篇wiki Python文章,Python是动态类型和强类型的(也提供了一个很好的解释)。
也许您正在考虑静态类型语言,其中类型在程序执行期间不能更改,并且在编译时进行类型检查以检测可能的错误。
你可能会对这个SO问题感兴趣:动态类型语言还是静态类型语言,这篇关于类型系统的维基百科文章提供了更多信息
class testme(object):
''' A test object '''
def __init__(self):
self.y = 0
def f(aTestMe1, aTestMe2):
return aTestMe1.y + aTestMe2.y
c = testme #get a variable to the class
c.x = 10 #add an attribute x inital value 10
c.y = 4 #change the default attribute value of y to 4
t = testme() # declare t to be an instance object of testme
r = testme() # declare r to be an instance object of testme
t.y = 6 # set t.y to a number
r.y = 7 # set r.y to a number
print(f(r,t)) # call function designed to operate on testme objects
r.y = "I am r.y" # redefine r.y to be a string
print(f(r,t)) #POW!!!! not good....
在一个大型系统中,上述情况会在很长一段时间内造成代码不可维护的噩梦。随便你怎么称呼它,但“动态”改变变量类型的能力只是一个坏主意……
术语“强类型”没有明确的定义。
因此,这个词的使用取决于你和谁说话。
我不认为任何没有显式声明变量类型或没有静态类型的语言是强类型的。
强类型不只是排除转换(例如,“自动”将整数转换为字符串)。它排除了赋值(即改变变量的类型)。
如果以下代码编译(解释),则该语言不是强类型的:
Foo = 1 Foo = "1"
在强类型语言中,程序员可以“依赖”类型。
例如,如果程序员看到声明,
UINT64 kZarkCount;
并且他或她知道20行之后,kZarkCount仍然是UINT64(只要它出现在同一个块中)——而不必检查中间的代码。