我了解到 Python 是强大动态类型的语言。
动态:变量的类型是在执行时确定的,而不是编译时间。对于这部分,我可以理解,当为变量赋值(路线类型)时确定类型。
强大:您无法更改变量的类型。 但这不是真实的情况:
>>> a = 1
>>> type(a)
<type 'int'>
>>> a = 's'
>>> type(a)
<type 'str'>
从上面的代码中,我可以将变量a的类型从 int 更改为 str 。
怎么会发生这种情况?我可以说Python是一种弱类型的语言吗?
修改 的
如果你能给我一个显示强大的动态类型影响 Python编程的代码片段,我会非常感激! 在我通常的编码过程中,我从不关心强动态类型问题。它也很少影响我的代码功能。怪异!
修改
答案的结论:
答案 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中你不能做这样的事情;如果你想让一个类型像另一个那样,你必须实际创建一个新类型的新对象,因为对象的类型是对象固有的。