Python如何区分不同的数据类型?

时间:2010-03-15 05:04:46

标签: python

很抱歉,如果这对您来说非常不合适,但我刚开始学习C ++和C ++之后学习Python。 Java,我想知道在世界上我如何能够声明id = 0name = 'John'之类的变量,前面没有任何intstring!我想通了也许是因为数字中没有',但是Python会如何在{+ 1}}中找出它而不是像C ++中的def increase(first, second)那样?!< / p>

5 个答案:

答案 0 :(得分:13)

你提到的文字对象当然带有(-)他们自己的类型的指针,所以当一个名字绑定到那个对象时,类型的问题不会出现 - 对象总是有一个类型,名字不 - 只是将它委托给它所绑定的对象。

def increase(first, second):中没有“搞清楚” - 名称increase被绑定到一个函数对象,名称firstsecond被记录为参数名称和意志<{1}}被调用时,绑定(很可能是不同点上不同类型的对象)。

所以说正文是increase - 调用return first + second然后会很高兴地返回increase('foo', 'bar')(将对象委托给对象,在这种情况下是字符串),也许稍后,对'foobar'的调用将同样愉快地返回increase(23, 45) - 再次通过将加法委托给在调用点处绑定到这些名称的对象,在本例中为int。如果你使用不兼容的类型调用,你会得到一个例外,因为委托的加法操作无法理解这种情况 - 没什么大不了的!

答案 1 :(得分:7)

Python是动态类型:所有变量都可以引用任何类型的对象。 idname可以是任何内容,但实际对象的类型包括intstr0是一个解析为生成int对象的文字,'John'是一个生成str对象的文字。许多对象类型没有文字,并且由可调用的函数返回(如frozenset - 无法创建文字的冻结集,您必须调用frozenset。)

因此,没有变量声明,因为您没有定义变量的任何内容。 id = 0name = 'John'只是作业。

increase会返回int,因为这是你返回的内容; Python中没有任何东西强迫它不是任何其他对象。如果您这样做,firstsecond只是整理。

对象在一定程度上共享一个通用接口。您可以在它们上面使用相同的运算符和函数,如果它们支持该特定操作,则它可以工作。这是一种常见的推荐技术,可以使用不同类型,可以互换的方式相似;这叫做 duck typing 。例如,如果某个内容需要file个对象,则可以改为传递cStringIO.StringIO对象,该对象支持与文件相同的方法(如readwrite)但是完全不同的类型。这有点像Java接口,但不需要任何正式用法,只需定义适当的方法。

答案 2 :(得分:6)

Python使用鸭子打字方法 - 如果它像鸭子那样走路,看起来和嘎嘎叫,那么它就是一只鸭子。如果传入一个字符串,并尝试对其进行数字处理,那么它将失败。

请查看:http://en.wikipedia.org/wiki/Python_%28programming_language%29#Typinghttp://en.wikipedia.org/wiki/Duck_typing

答案 3 :(得分:4)

当涉及将字面值分配给变量时,可以在词法分析时推断出文字值的类型。例如,可以将与正则表达式(-)?[1-9][0-9]*匹配的任何内容推断为整数文字。如果要将其转换为浮点数,则需要进行显式转换。类似地,字符串文字是用单引号或双引号括起来的任何字符序列。

在方法调用中,参数未经过类型检查。您只需传入正确数量的它们即可调用该方法。只要方法的主体不会导致参数的任何错误,您就可以使用许多不同类型的参数调用相同的方法。

答案 4 :(得分:0)

在Python中,与C ++和Java不同,数字和字符串都是对象。所以这个:

   id = 0
   name = 'John'

相当于:

   id = int(0)
   name = str('John')

由于变量idname是可以解决任何Python对象的引用,因此不需要使用特定类型声明它们。