动态类型是Python语言灵活性的根源

如果你接触过C、C++或者JAVA,也许会觉得,Python怎么这么不严谨,使用变量的时候都没有声明变量的类型。
C语言中:int a = 3,而Python:a = 3
原来,Python并不会声明脚本中使用对象的确切类型,也不在意特定类型,这样它就非常灵活了,变量a赋值为整型便是整型,赋值为字符串便是字符串,类型都是在运行过程中自动决定的,不需要像C、C++或JAVA这些静态编译类型语言一样,事先需要声明。因此,像Python这样的语言也称为动态类型语言。

所谓动态类型语言,就是定义变量或参数时,不需要声明其数据类型int、string等。JavaScript、Ruby、Python等都属于动态类型语言。

静态类型语言(Statically Typed Language)与之相反,它的类型在运行前就已经判断(如编译阶段)。C#、java就是静态类型语言。

请勿混淆:

动态/静态类型语言 与 动态/静态语言 是不相同的。

动态类型语言,声明变量:

//Python
x = 1
y = 2
sum = x + y

静态类型语言,声明变量:

//JAVA
int x = 1;
int y = 2;
int sum = x + y;

相关注意,Python中的语句结束符:

在Python中,当一个物理行只有一个逻辑行时,无需使用分号';'作为结束符,例如:
x = 1
y = 2
当一个物理行有两个或以上逻辑行时:
x = 1 ; y = 2 ;

在Python中,变量的数据类型由赋值语句决定:

x = '1'   #字符串
x = 5     #整型
x = True  #布尔型

Python的变量
Python的变量只是一个名字而已,它的作用仅仅是引用对象,引用任何类型的对象,并不关联类型信息或者约束。

Python的对象
对象是分配的一块内存,有足够的空间去表示定义的值。对象类型有Integer、Boolean、Long integer、Floating point real number、Complex number、String、List、Tuple、Dictionary等,都有两个标准的头部信息:一个类型标识符去标识这个对象的类型,一个引用的计数器,用来决定是不是可以回收这个对象。

Python的赋值
请思考这样一个问题:

a = 12
b = 12

请问这两个赋值语句一共分配了几个存储12的内存?
答案:是一个。
赋值的过程是什么样的呢?
1、创建一个对象来代表12
2、创建变量a
3、将变量a与对象12相连接,也就是让a引用12。
4、创建变量b
5、将变量b与对象12也进行连接,也就是让b也引用12。
因此,变量a和b都引用了相同的对象12,也就是说指向了相同的内存空间,这在Python中叫做共享引用----------多个变量名引用同一个对象。

注意,变量a 和变量b 引用的都是数值类型,如果引用的是字符串、列表、元组或集合,他们仍然指向同一个对象么?

如何判断不同的变量指向了同一个对象呢?
这就要了解一下对象的三个基本要素,分别是:id(身份标识)、type(数据类型)和value(值)。
is 和 ==都是对象操作符:
is被称为同一性运算符,用来判断不同对象的id是否相同,也就是不同的变量是否指向同一个内存空间。例如:

a = "woshizifuchuan"
b = "woshizifuchuan"
print(a is b)

输出:True or False ?
也可以通过id函数计算出id值来判断:id(object)
返回的是对象的“身份证号”:

id(a)
140589661955648
id(b)
140589661955648

==是用来比较不同对象的value(值)是否相同:

a = ('a','bc','g')
b = ('a','bc','g')
print(a==b)

输出:True

在静态类型语言中,变量类型的判断是在编译阶段进行的:

//JAVA
int x = 1;
int y = 2;
String sum = x + y;

C:\Users\*****\Desktop>javac sum.java
sum.java:7: 错误: 不兼容的类型: int无法转换为String
String sum = x + y;

在Python中,代码是否合法要到运行时才能判断(注意是运行时的类型判断):

# -*- coding: UTF-8 -*-     
def add(x, y):       #此处并没有指定参数x、y的数据类型
    sum = x + y
    return "\'{0}+{1}\' 的结果是:{2}".format(x,y,sum)
    #使用format函数进行字符串格式化,不需要指定是字符串还是数字类型
sum = add(3, 5)      #调用函数add(x, y)时,才能确定参数x、y的数据类型
print sum
----------------------------------------------------------
C:\Users\*****\Desktop>python sum.py
'3+5' 的结果是:8

如果要输出中文,需要在文件最上面加上 # -- coding: UTF-8 -- 这行注释,在python 3.x版本中,需要将该py文件存储为UTF-8编码格式,而不是默认的ANSI

在python 3.x版本中,print 已经成了个内置函数,而不再是语句了,因此需要将print sum 替换为 print(sum)

函数的参数是在赋值时才能确定其数据类型的。

sum = add(3, 5)             #均是整型
sum = add('3', '5')         #均是字符串(string)
sum = add(3, 5j)            #整型,复数
sum = add(3.1, 5.3)         #均是浮点型
sum = add(3.1, 5L)          #浮点型,长整型   注意:python 3版本中只有一种整数类型 int,表示为长整型,没有 python2 中的 Long。
sum = add(True, True)       #均是布尔型
sum = add(True, 3)          #布尔型,整型
sum = add(-True, 3.5)       #布尔型,浮点型
sum = add('3', 5)           #x是字符串(string),y均是整型   注意:字符串和数值无法相加,也不能联结。

运行过程中,检查代码是否合法:

C:\Users\******\Desktop>python sum.py
sum = add(3, 5)-------'3+5' 的结果是:8
sum = add('3', '5')---'3+5' 的结果是:35      #此处"+"的作用是拼接
sum = add('3', '5')---'3+5j' 的结果是:(3+5j)
sum = add(3.1, 5.3)---'3.1+5.3' 的结果是:8.4
sum = add(3.1, 5L)----'3.1+5' 的结果是:8.1
sum = add(True, True)-'True+True' 的结果是:2  #True的值是1,False是0
sum = add(True, 3)----'True+3' 的结果是:4
sum = add(-True, 3.5)-'-1+3.5' 的结果是:2.5
sum = add('3', 5)-----Traceback (most recent call last):
  File "sum.py", line 21, in <module>
    sum = add('3', 5)
  File "sum.py", line 3, in add
    sum = x + y
TypeError: cannot concatenate 'str' and 'int' objects

注意,在运行过程中,x赋值为'3',所指向的对象是字符串类型('str'),y赋值为5,所指向的对象是整型('int'),它们既不能相加,也不能拼接。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容