很抱歉,如果这对您来说非常不合适,但我刚开始学习C ++和C ++之后学习Python。 Java,我想知道在世界上我如何能够声明id = 0
和name = 'John'
之类的变量,前面没有任何int
或string
!我想通了也许是因为数字中没有'
,但是Python会如何在{+ 1}}中找出它而不是像C ++中的def increase(first, second)
那样?!< / p>
答案 0 :(得分:13)
你提到的文字对象当然带有(-)他们自己的类型的指针,所以当一个名字绑定到那个对象时,类型的问题不会出现 - 对象总是有一个类型,名字不 - 只是将它委托给它所绑定的对象。
def increase(first, second):
中没有“搞清楚” - 名称increase
被绑定到一个函数对象,名称first
和second
被记录为参数名称和意志<{1}}被调用时,绑定(很可能是不同点上不同类型的对象)。
所以说正文是increase
- 调用return first + second
然后会很高兴地返回increase('foo', 'bar')
(将对象委托给对象,在这种情况下是字符串),也许稍后,对'foobar'
的调用将同样愉快地返回increase(23, 45)
- 再次通过将加法委托给在调用点处绑定到这些名称的对象,在本例中为int。如果你使用不兼容的类型调用,你会得到一个例外,因为委托的加法操作无法理解这种情况 - 没什么大不了的!
答案 1 :(得分:7)
Python是动态类型:所有变量都可以引用任何类型的对象。 id
和name
可以是任何内容,但实际对象的类型包括int
和str
。 0
是一个解析为生成int
对象的文字,'John'
是一个生成str
对象的文字。许多对象类型没有文字,并且由可调用的函数返回(如frozenset
- 无法创建文字的冻结集,您必须调用frozenset
。)
因此,没有变量声明,因为您没有定义变量的任何内容。 id = 0
和name = 'John'
只是作业。
increase
会返回int
,因为这是你返回的内容; Python中没有任何东西强迫它不是任何其他对象。如果您这样做,first
和second
只是整理。
对象在一定程度上共享一个通用接口。您可以在它们上面使用相同的运算符和函数,如果它们支持该特定操作,则它可以工作。这是一种常见的推荐技术,可以使用不同类型,可以互换的方式相似;这叫做 duck typing 。例如,如果某个内容需要file
个对象,则可以改为传递cStringIO.StringIO
对象,该对象支持与文件相同的方法(如read
和write
)但是完全不同的类型。这有点像Java接口,但不需要任何正式用法,只需定义适当的方法。
答案 2 :(得分:6)
Python使用鸭子打字方法 - 如果它像鸭子那样走路,看起来和嘎嘎叫,那么它就是一只鸭子。如果传入一个字符串,并尝试对其进行数字处理,那么它将失败。
请查看:http://en.wikipedia.org/wiki/Python_%28programming_language%29#Typing和http://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')
由于变量id
和name
是可以解决任何Python对象的引用,因此不需要使用特定类型声明它们。