python强/弱动态/静态类型语言?

时间:2014-01-15 07:36:43

标签: python types strong-typing

我了解到 Python 强大动态类型的语言。
动态:变量的类型是在执行时确定的,而不是编译时间。对于这部分,我可以理解,当为变量赋值(路线类型)时确定类型。

强大:您无法更改变量的类型。 但这不是真实的情况:

>>> a = 1
>>> type(a)
<type 'int'>
>>> a = 's'
>>> type(a)
<type 'str'> 

从上面的代码中,我可以将变量a的类型从 int 更改为 str
怎么会发生这种情况?我可以说Python是一种弱类型的语言吗?


修改

如果你能给我一个显示强大的动态类型影响 Python编程的代码片段,我会非常感激! 在我通常的编码过程中,我从不关心强动态类型问题。它也很少影响我的代码功能。怪异!


修改
答案的结论:

  1. 只有对象/值具有type属性。变量没有类型。
  2. (强)类型确定可以执行的操作 在对象/值之间/之间(可能是引用它们的变量)。
  3. (动态)类型表示变量只是一个标签(引用 对象/值)。此标签可以引用任何类型的任何对象/值。

4 个答案:

答案 0 :(得分:2)

您没有更改变量的类型,而是将a int重新分配给现在的全新变量同名,这是一个str

答案 1 :(得分:2)

当您为变量重新分配新值时,我不会说它是“相同”变量,因为它的标识符会发生变化。看看这个例子:

a = 1
print id(a)
a = 2
print id(a)
a = "asd"
print id(a)

在我的机器上打印:

30925512
30925488
37467840

这意味着a不再是同一个对象。来自Python Docs

  

id(object)返回对象的“标识”。这是一个整数(或长整数),保证在该生命周期内该对象是唯一且恒定的。

答案 2 :(得分:2)

关键是无论你做什么,对象都会保留它的类型。 int是int是int; str是str;浮子是浮子。在弱类型语言中,您可以执行类似

的操作
i = "1" 
j = i + 2

并获得j == 3.在python中,你得到

TypeError: cannot concatenate 'str' and 'int' objects

str始终是str,即使字符串包含数字,也不能将其视为int。

试试这个:

for a in {1, 'abc', 3.14159}:
    print a
    print type(a)

将产生

3.14159
<type 'float'>
1
<type 'int'>
abc
<type 'str'>

可以设置单个变量来引用任何类型的对象 - 这是它的“动态”部分。但无论你如何引用它,对象总是属于同一类型 - 这是它的“强大”部分。

答案 3 :(得分:0)

更准确地说,Python是强类型的,因为您无法更改对象的类型。 Python变量与许多其他语言中的变量略有不同,因为它们只是指向对象的名称。名称本身不包含类型信息,只包含对象。

在像JavaScript这样的弱类型语言中,您可以执行类似1 == "1"的操作并获得真实结果,或执行3 - "2"并获得1,因为对象隐式强制整数和字符串之间;对象的类型不是“其身份的一部分”,并且根据上下文,对象的行为类似于不同的类型。在Python中你不能做这样的事情;如果你想让一个类型像另一个那样,你必须实际创建一个新类型的新对象,因为对象的类型是对象固有的。

相关问题