第5章 变量与运算符
"""
下述代码注释是自己的理解
规范的解释如下:
int/float为值类型的,是不可变的,不可变类型还有str/tuple等
list/set/dict是引用类型,是可变的
简单说就是引用类型是可变的,值类型是不可变的
"""
a = 1.1 #创建常量1的内存空间,使得变量a指向该地址
b = a #使b也指向该地址
a = 3.2 #再创建常量3的内存空间,使变量a指向该新内存地址
print(a, b) #a变成3,b仍然为1
a = [1, 2, 3, 4, 5] #创建存储列表信息的一块内存空间,使a指向该地址
b = a #使b也指向该地址
a[0] = "abc" #使得原存储列表信息的第一个元素改变
#上述这句代码是创建一处新内存空间,使得列表第一个元素指向该地址
#但变量a,b的指向仍为原列表的存储地址
print(a, b) #b也就跟着变化了
#再看下例
a = [1, 2, 3, 4, 5] #创建存储列表信息的一块内存空间,使a指向该地址
b = a #使b也指向该地址
a = [1, 2, 3, 4] #创建一处新内存空间,使得变量a指向该新地址
print(a, b) #a变了,b不变
#灵活理解可变与不可变类型
a = "hello"
a = a + " python" #创建一处新内存空间存储相加后的新字符串,并让a指向该新字符串地址
print(a) #a变了,但最初始的hello字符串仍然储存在内存中,可以用id()函数查看地址
a = "hello"
#a[0] = "s" 这里会报错,这就是不可变性
print(a)
t1 = (1, 2, 3, 4)
#t1[0] = "s" 同样会报错
print(t1[2])
t1 = ([1,2], 10, 11, 12, [20, 30])
print(id(t1[0]))
t1[0][1] = 1 #这里却不会报错
print(id(t1[0])) #因为第一个元素的内存地址没有变化
print(t1) #t1的第一个元素值变化了,但t1各元素的指向没有变化
#列表的可变与元组的不可变
#列表的可变和元组的不可变
a = [1, 2, 3]
print(id(a))
a[0] = "1"
b = a
print(id(a), id(b))
a.append(4) #列表追加元素,a内容改变,指向不变
print(a, id(a))
#元组是不可变的,所以不能通过索引修改元素,也无法append()追加
ta = (1, 2, 3, [1, 2, 4])
print(ta[3][2])
y = ta[1]
print(id(y), id(ta[1]))
#ta[1] = 10 这里会报错,元组的各个元素内容/指引是不可变的
#这里创建一个新内存区域,让ta[1]指向该地址,但元组元素的指向是不可变的
print(ta, id(ta), id(ta[3]))
ta[3][2] = 18
#上面这句可以执行,因为ta[3]的指向没有变
#虽然元组第四个元素中的第三个元素内容变了,但元组第四个元素的指向并没有改变
print(ta, id(ta),id(ta[3])) #地址与上面一致
#运算符
#运算符
#成员运算符in / not in
print("s" in "system")
print(" " in "hello World!")
print(18 in (9, 18, 27))
print(1 not in [1, 2, 3])
print(2 in range(3))
print(20 in range(1, 20))
print("A" in {"A":1, "B":2, "C":4}) #字典的成员判断是看key值
print("D" not in {"A":1, "B":2, "C":4})
#身份运算符 is /is not
#可以理解为两个变量是否是同一内存指向
a = 1
b = 1 #b依然指向常量1的空间
print(a is b)
print(id(a), id(b)) #相同
a = [1, 2, 3]
b = [1, 2, 3] #新开辟空间,让b指向该处
print(a is b)
print(id(a), id(b)) #不同
#判断变量是否为某一或某几种数据类型
print(isinstance(1, int))
a = [1, 2, 3]
print(isinstance(a, (int, list)))
print(isinstance(a, (int, float, str)))
#位运算符:把数值转为二进制进行位运算操作
#&按位与 |按位或 ^按位异或 ~按位取反 <</>>按位左/右移动
a = 2 #10
b = 7 #111
print(a&b) #输出010,即十进制2
print(a|b) #输出111,即十进制7
print(a^b) #输出101,即十进制5