# 变量 a = [1, 2, 3, 4] # 定义一个变量 type = 1 print(type) type(1) # 此时的type是1 至关因而1(1) 所以int 不是可调用的 # 输出结果 1 TypeError: 'int' object is not callable
int str tuple
不可改变list set dict
可改变# 值类型 a = 1 b = a a = 3 print(a) print(b) # 引用类型 list1 = [1, 2, 3, 4] list2 = list1 list1[1] = '2' print(list1) print(list2) # 输出结果 3 1 [1, '2', 3, 4] [1, '2', 3, 4]
上述值类型和引用类型要进行区分,其中值类型会常见一块新的内存空间来存储,对于引用类型仅仅是一个指针,指向的仍是同一个内存区域python
string = 'hello' id(string) # id方法能够展现出来某个变量在内存中的地址 string = string + ' python' id(string) # 能够发现string已经发生了改变 指向了一个新的内存区域 string[0] = 'a' # str一旦定义 不可改变 # 输出结果 57705504 12109688 'str' object does not support item assignment
list 是可变的对象,元组 tuple 是不可变的对象安全
因为 tuple 不可变,因此使用 tuple 可使代码更安全多线程
tuple 不可变的好处并发
相对于 list 而言,tuple 是不可变的,这使得它能够做为 dict 的 key,或者扔进 set 里,而 list 则不行。app
tuple 放弃了对元素的增删(内存结构设计上变的更精简),换取的是性能上的提高:建立 tuple 比 list 要快,存储空间比 list 占用更小。因此就出现了“能用 tuple 的地方就不用 list”的说法。性能
多线程并发的时候,tuple 是不须要加锁的,不用担忧安全问题,编写也简单多了。测试
# 不可修改值 a = [1, 2, 3] print(id(a)) print(hex(id(a))) a[0] = '1' print(id(a)) a= (1, 2, 3) a[0] = '1' # error # append 操做 b = [1, 2, 3] b.append(4) print(b) c = (1, 2, 3) c.append(4) # tuple类型没有append的方法 # 输出结果 69249416 0x420a988 69249416 'tuple' object does not support item assignment [1, 2, 3, 4] 'tuple' object has no attribute 'append'
+ - * / 除以 获得的都是float // 整除 向下取整 % 求余 ** 次方 2**3 2的三次方
= += *= /= //= %= **= # 注意 python中没有++ -- 运算符
== # 对于number类型来讲 == 判断是相等的 != > < >= <= # 返回的是一个bool类型 d = 1 d+=d>=1 print(d) # 2 # == 的特殊性 a = 0 b = False print(a == b) # True
and or not 返回的都是bool类型 ''' 逻辑短路原则 and 第一个为真 那么返回第二个;若是第一个为假,返回第一个 or 第一个为假,那么返回第二个;若是第一个为真,返回第一个 同时要注意 基本类型 和 True False的转化 '''
判断一个元素是否在另外的一组元素当中线程
in not in # 成员运算符能够在字符串、列表、元祖、集合、字典中进行应用,返回结果为布尔类型 b = 'c' print(b in {'c':1}) # 输出结果 True # 字典判断的是key是否在字典中
is not # 若是两个变量取值相等,则is返回True a = 1 b = 2 a is b # False b = 1 a is b # True # is和 == 的区别 ''' == 表示的是值是否相等 is 表示的是所指向的内存地址是否相等 ''' a = 1 b = 1.0 a == b # True a is b # False # 思考题目 a = {1,2,3} b = {2,1,3} a == b # True 集合是无序的 a is b # False 因为是引用类型 所以表示的是两个集合 能够用id()测试 c = (1,2,3) d = (2,1,3) c == d # False 元组属于序列 它是无序的 c is d # False 虽然是值类型 由于值类型是两个值 所以内存地址也不一样
# 判断方法一 a = 1 type(a) == int # True 不推荐使用 不能判断变量的子类是否为该类型 # 判断方法二 isinstance(a,str) # False isinstance(a,(int,str,float)) # 这个方法的第二个参数能够接受一个元组,那么就判断a是否为元组中的任意一种 True # 注意说明: 对象的三个特征:id value type
都是把数当作二进制进行运算 & 按位与 | 按位或 ^ 按位异或 相同为0 相反为1 - 按位取反 << 左移运算符 >> 右移运算符