这句话是真的吗?
Python不强制执行严格类型 在容器或变量上。有了这个 概念,开发人员可以设计一个 容器可容纳不同类型的容器 数据
我正在写一篇关于Python的文章并在random site上发现这个声明,只是想知道是否有人可以为我澄清它。
答案 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)
numpy
)都使用它来产生很好的效果。