一、条件
第一大类:显式布尔值
1.条件可以是:比较运算符
age = 18
print(age > 16) # 条件判断之后会得到一个布尔值
2.条件可以是:True、False
is_beautiful=True
print(is_beautiful)
第二大类:隐式布尔值,所有的值都可以当成条件去用
其中0、None、空(空字符串、空列表、空字典)==》代表的布尔值为False,其余都为True。
二、if判断
用缩进来表示代码层级,在if语法中,当条件结果为True,执行下附层级的代码,当条件结果为False,执行下一与if判断同层级代码块或代码。
在if-elif-else结构中,只有一个代码块内的代码会被成功执行。
1.语法一:一种情况
if 条件:
代码1
代码2
代码3
score = input('请输入成绩:')
score = int(score)
if score >= 0:
print('有成绩')
2.语法二:一种情况与除此之外的其他所有情况
if 条件:
代码1
代码2
代码3
else:
代码1
代码2
代码3
score = input('请输入成绩:')
score = int(score)
if score >= 60:
print('及格')
else:
print("未及格")
3.语法三:多种情况与其他所有情况
if 条件1:
代码1
代码2
代码3
elif 条件2:
代码1
代码2
代码3
elif 条件3:
代码1
代码2
代码3
# ...
else:
代码1
代码2
代码3
score = input('请输入成绩:')
score = int(score)
if score >= 90:
print('优秀')
elif 80 <= score < 90:
print('良好')
elif 70 <= score < 80:
print('普通')
else:
print("差")
4.语法四:if嵌套
if 条件1:
代码块1
if 条件2:
代码块2
else:
代码块3
三、列表的深浅copy
list1 = [
'egon',
'lxx',
[1, 2]
]
1.误区:
list2 = list1 # 这不叫copy
二者分隔不开,list1改list2也跟着改,因为指向的就是同一个地址。
list1 = [
'egon',
'lxx',
[1, 2]
]
list2 = list1
print(list2) # ['egon', 'lxx', [1, 2]]
list1[0] = 'Bye'
print(list2) # ['Bye', 'lxx', [1, 2]]
2.如何copy列表
1、拷贝一下原列表产生一个新的列表 2、想让两个列表完全独立开,并且针对的是改操作的独立而不是读操作
a.浅copy
list3 = list1.copy()
print(list3) # ['egon', 'lxx', [1, 2]]
print(id(list1)) # 2336533508928
print(id(list3)) # 2336533334976
print(id(list1[0]),id(list1[1]),id(list1[2]))
# 2392063016368 2392064337072 2392065767104
print(id(list3[0]),id(list3[1]),id(list3[2]))
# 2392063016368 2392064337072 2392065767104
从上例可看出,浅copy是把原列表第一层的内存地址不加区分的完全copy一份给新列表。
注意点1:对于不可变类型的赋值,都是产生了新值,让原列表的索引指向新的内存地址,并不会影响新列表
list1 = [
'egon',
'lxx',
[1, 2]
]
list3 = list1.copy()
list1[0] = 'hello'
list1[1] = 'world'
list1[2] = 10086
print(list3) # ['egon', 'lxx', [1, 2]]
注意点2:对于可变类型,我们可以改变可变类型中包含的值,但内存地址不变。即原列表的索引指向仍然指向原来的内存地址,于是新列表也跟着一起受影响,如下
list1 = [
'egon',
'lxx',
[1, 2]
]
list3 = list1.copy()
list1[2][0]=111
list1[2][1]=222
print(list1) # ['egon', 'lxx', [111, 222]]
print(list3) # ['egon', 'lxx', [111, 222]]
print(id(list1)) # 2584832898112
print(id(list3)) # 2584832723968
print(id(list1[2])) # 2584832899072
print(id(list3[2])) # 2584832899072
b.深copy
综合注意点1和注意点2可以得出,要想copy得到的新列表与原列表的改操作完全独立开,必须有一种可以区分开可变类型与不可变类型的copy机制,这就是深copy。
import copy
list1 = [
'egon',
'lxx',
[1, 2]
]
list4 = copy.deepcopy(list1)
print(list4) # ['egon', 'lxx', [1, 2]]
print(id(list1)) # 2964454438016
print(id(list4)) # 2964454438848
# 不可变 不可变 可变
print(id(list1[0]),id(list1[1]),id(list1[2]))
# 4497919088 4498367856 4498449216
print(id(list4[0]),id(list4[1]),id(list4[2]))
# 4497919088 4498367856 4498595328
从上例可看出,深copy在不可变类型上,完全复制的是内存地址,当对原列表进行改变时,其内存地址的指向发生改变,新列表则不受影响。但在可变类型上,只复制了值,产生了新的内存空间。
import copy
list1 = [
'egon',
'lxx',
[1, 2]
]
list4 = copy.deepcopy(list1)
list1[2][0] = 10086
list1[2][1] = 10000
print(list1) # ['egon', 'lxx', [10086, 10000]]
print(list4) # ['egon', 'lxx', [1, 2]]
print(id(list1)) # 1758181520512
print(id(list4)) # 1758181521344
print(id(list1[0]),id(list1[1]),id(list1[2]))
# 1758175296944 1758180090992 1758182584640
print(id(list4[0]),id(list4[1]),id(list4[2]))
# 1758175296944 1758180090992 1758181521600
print(id(list1[2][0]),id(list1[2][1]))
# 1758175525328 1758181186352
print(id(list4[2][0]),id(list4[2][1]))
# 140713604355744 140713604355776
list4 = copy.deepcopy(list1)
list1[2][0] = 10086
print(list1) # ['egon', 'lxx', [10086, 2]]
print(list4) # ['egon', 'lxx', [1, 2]]
print(id(list1[0]),id(list1[1]),id(list1[2]))
# 2772601601456 2772606592112 2772609081600
print(id(list4[0]),id(list4[1]),id(list4[2]))
# 2772601601456 2772606592112 2772608022656
print(id(list1[2][0]),id(list1[2][1]))
# 2772601829840 140713604355776
print(id(list4[2][0]),id(list4[2][1]))
# 140713604355744 140713604355776
结论:如果想复制一个列表,并且让两个列表的改操作完全独立,应该用深copy。