我遇到过一些链接,上面说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是一种强类型语言:
>>> 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
Python是强类型的,因为它没有未检查的动态类型错误。换句话说,您不能违反它的类型系统。
定义
Type: set of values. It partially defines the intended usage (behaviour) of its values. It can be specified in extension with an enumeration or in intension with a predicate. Type system: system checking that values are used as intended, avoiding undefined behaviour partially. Undefined behaviour should be avoided because it can lead to late program crash or silent loss of data and production of incorrect results. Typed language: language with a type system. Type error: program error checkable by a type system. Expression: program text denoting a value. Static/dynamic type: compile-time/run-time type of an expression. The run-time type of an expression is the type of the value that it denotes. Static/dynamic type system: type system checking static/dynamic types. Statically/dynamically typed language: language with a static/dynamic type system. Static/dynamic type error: program error checkable by a static/dynamic type system. Weakly/strongly typed language: language with/without unchecked dynamic type errors. Statically typed, dynamically typed, or both imply strongly typed. Monomorphic/polymorphic expression: expression having a single dynamic type/multiple dynamic types. A monomorphic expression has single intended usage, and a polymorphic expression has multiple intended usage. Universal/ad-hoc polymorphic expression: real/virtual polymorphic expression. A real polymorphic expression denotes a single value that has multiple types, and a virtual polymorphic expression denotes multiple values that have single types. Parametric/inclusion polymorphic expression: universal polymorphic expression based on generic types/subtypes of a type (e.g. the C++ expression & denotes a single T* (T&) operator value where T is a generic type/the C++ expression std::exception denotes a single S class value where S is a generic subtype of std::exception). Overloading/coercion polymorphic expression: ad-hoc polymorphic expression based on expression/value conversion (e.g. the C++ expression + denotes int (int&, int&) and float (float&, float&) operator values/the C++ expression 3.5 denotes float and bool values).
参考
Cardelli (Luca), Wegner (Peter),“关于理解类型,数据抽象和多态性”,计算调查,第17卷,第4期,1985,第471-523页,DOI: https://doi.org/10.1145/6041.6042。
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....
在一个大型系统中,上述情况会在很长一段时间内造成代码不可维护的噩梦。随便你怎么称呼它,但“动态”改变变量类型的能力只是一个坏主意……
我刚刚发现了一个极好的、简洁的记忆方法:
动态/静态类型表达式;强/弱类型值。
根据这篇wiki Python文章,Python是动态类型和强类型的(也提供了一个很好的解释)。
也许您正在考虑静态类型语言,其中类型在程序执行期间不能更改,并且在编译时进行类型检查以检测可能的错误。
你可能会对这个SO问题感兴趣:动态类型语言还是静态类型语言,这篇关于类型系统的维基百科文章提供了更多信息