Python数据类型

时间:2011-01-09 21:44:22

标签: python types

这句话是真的吗?

  

Python不强制执行严格类型   在容器或变量上。有了这个   概念,开发人员可以设计一个   容器可容纳不同类型的容器   数据

我正在写一篇关于Python的文章并在random site上发现这个声明,只是想知道是否有人可以为我澄清它。

5 个答案:

答案 0 :(得分:10)

是的,是的。

除了设计容器外,常规列表可以包含多种类型

>>> myList = [1, 3.14, 'string', {'key1':'value1'}, frozenset([5,2,2,3]), [1,2,3],(5+2j),(4.0,5.0), True, type(5)]
>>> myList
[1, 3.1400000000000001, 'string', {'key1': 'value1'}, frozenset([2, 3, 5]), [1, 2, 3], (5+2j), (4.0, 5.0), True, <type 'int'>]
>>> [type(x) for x in myList]
[<type 'int'>, <type 'float'>, <type 'str'>, <type 'dict'>, <type 'frozenset'>, <type 'list'>, <type 'complex'>, <type 'tuple'>, <type 'bool'>, <type 'type'>]

即使type是一种类型

答案 1 :(得分:6)

考虑这个清单

mixed = [ "hello", 3.1415926, 42, (1+2j) ]

该列表包含4个项目,每个项目都有不同的类型。

在Java中,您必须声明一个类型。

List<String> javaList= new LinkedList<String>();

此Java列表只能包含String对象。

答案 2 :(得分:3)

正如其他答案所指出的那样,这对于python来说确实如此。我还想指出,这是几种高级语言的一个特性,包括Ruby甚至JavaScript(iirc)。就Java而言,技术上可以设计一个容纳的容器 多种类型,但它需要从相同的类型派生这些类型,然后必须像往常一样使用类型转换。例如,在Java中,可以写:

Object[] mObjArr = new Object[2];
String mString = "This is a String";
Double mDouble = 3.1415;

void assignElements() {
   mObject[0] = (Object) mString;
   mObject[1] = (Double) mDouble;
}
String getString() {
   if (mObject[0] instanceof String) return (String) mObject[0];
   else return null; // or empty string or throw exception etc.
}
Double getDouble() {
   if (mObject[1] instanceof Double) return (Double) mObjects[1];
   else return null; // or Double.NaN or throw exception etc.
}

使用指向void的C / C ++中的类似解决方案是可能的 但至少可以说类型检查变得毛茸茸。

答案 3 :(得分:2)

在Python中,一切都是对象:

>>> id("hello world")
4312841696

在这里,你可以看到一个文字(在这种情况下是一个字符串)有一个为它保留的内存空间。

>>> class Foo(object):
...     pass
...
>>> id(Foo)
4297723600

即使是Classes也是对象的实例。因此,考虑到这一点,list / dict / set只包含对象的引用,无论它们是什么类的实例。

>>> a = [40L, "test", Foo, Foo()]
>>> a[0]
40L
>>> a[1]
'test'
>>> a[2]
<class '__main__.Foo'>
>>> a[3]
<__main__.Foo object at 0x1010e8710>    
祝你好运!

答案 4 :(得分:1)

  1. 标准容器是无类型的:您可以将任何值存储在列表或映射中,并使用几乎任何值作为映射中的键。 Java也有无类型的容器,但通常人们通过使用泛型来强制执行静态类型检查。
  2. 您可以实现容器的接口(不是显式的,您只需定义一组具有正确名称的方法),您的类将作为容器使用。您可以随心所欲,包括类型检查,具有默认值,高效存储等等。
  3. Python中的列表(数组)具有丰富的下标语义,例如:你可以使用简单的表达式获得一维和多维切片。内置和第三方特殊容器(例如来自numpy)都使用它来产生很好的效果。