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

6
抱歉,如果这对你来说太土了,但是我刚开始学习Python,在学习C++和Java之后,我想知道如何像id = 0name = 'John'这样声明变量而不需要在前面添加intstring!我发现可能是因为数字中没有'',但是在类似于def increase(first, second)的情况下,Python如何处理呢?毕竟它不像C ++中的int increase(int first, int second)那样有具体指定类型。

2
只是一个提示:不要将您的变量命名为像“id”这样的东西,它会覆盖内置函数id()。在Python中,函数是一级对象,因此它们与变量共享命名空间。 - Grant Paul
我从Python::Boost学到的一件事是,Python中的每一件事,我是指__每一件事__都是来自类型对象(Python对象)。这就是为什么一个整数可以是字符串、字符、浮点数或任何其他类型,因为它们都是对象,并以这种方式处理。str、int等只是对象的派生类,因此可以进行转换。 - user945967
5个回答

13

当你提到字面对象时,它们当然携带着它们自己的类型的指针,因此当一个名称绑定到该对象时,类型问题就不会出现--对象总是有类型的,名称并没有--它只是将这个任务委托给了它所绑定的对象。

def increase(first, second): 中没有什么" figuring out "的过程 -- 名称 increase 被绑定到一个函数对象上,名称 firstsecond 被记录为参数名称,在调用increase时将被绑定(在各个点上可能被绑定到不同类型的对象)。

所以,如果函数体是 return first + second -- 对 increase('foo', 'bar') 的调用将会愉快地返回 'foobar'(将加法委托给对象,在这种情况下是字符串),也许稍后对 increase(23, 45) 的调用将会同样愉快地返回 68 -- 再次通过将委托加法操作绑定到那些名称所代表的对象来进行,这些对象在调用点可能是int型的。如果使用不兼容的类型调用,你将会得到一个异常,因为委托的加法操作无法理解这种情况--没有关系!


感谢你和其他所有贡献者的支持! :) - wrongusername

7
Python是动态类型语言:所有变量都可以引用任何类型的对象。id和name可以是任何东西,但实际对象的类型如int和str。0是一个文字,被解析为int对象,'John'是一个文字,制造一个str对象。许多对象类型没有文字,而是由可调用返回(例如frozenset-没有办法制作一个字面上的frozenset,必须调用frozenset)。
因此,不存在变量声明这样的事情,因为您并未定义有关变量的任何内容。 id = 0和name ='John'只是赋值。
increase返回一个int,因为在其中返回它;Python中没有强制它不是任何其他对象。如果使它们成为整数,则first和second仅为整数。
对象在一定程度上共享公共接口。您可以在所有对象上使用相同的运算符和函数,如果它们支持特定操作,则可以正常工作。使用行为类似的不同类型通常是推荐的技术; 这称为鸭子类型。例如,如果某物需要file对象,则可以传递cStringIO.StringIO对象,该对象支持与文件相同的方法(例如read和write),但是是完全不同的类型。这有点像Java接口,但不需要任何正式用法,您只需定义适当的方法。

谢谢!我完全会给你点赞,但不幸的是我已经达到了每日投票限制。 - wrongusername

6

4

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

在方法调用中,参数不会进行类型检查。您只需要传递正确数量的参数即可调用该方法。只要方法的主体对于参数没有任何错误,就可以使用许多不同类型的参数调用同一个方法。


(当然,实际的词法分析规则比这个稍微复杂一些。) - Mike Graham
另外,要严谨一些,(-)?[1-9][0-9]* 是一个 十进制 整数字面量的样子。 - Mike Graham

0
在Python中,与C++和Java不同的是,数字和字符串都是对象。所以这个:
   id = 0
   name = 'John'

等同于:

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

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


1
这篇文章有几个误导性的地方。1)确实,Python中的ints和strs是对象,而C++和Java也有一些原始类型和对象,但这并不是你不必在Python中声明变量的原因。2)等价的代码应该是id = int(0)name = str('John')NumberString在Python中不是任何东西的名称,重新表述这样的内容并没有真正澄清任何问题,因为这仍然需要从字面上创建intstr对象。3)“对象指针”在Python的上下文中不是一个技术术语,据我所知。 - Mike Graham
好观点,Mike;已进行编辑。用构造函数替换字面量的重点在于,对于初学者来说,很难意识到字面量返回对象引用。 - Tom
我希望这样做是有效的,尽管它并没有真正解决这些字面量创建对象的问题(然后传递给intstr)。同时,欢迎来到SO!=) - Mike Graham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接