Python if条件判断、列表的深浅copy

56 阅读6分钟

一、条件

第一大类:显式布尔值

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。