今天先继续DAY2的问题,就是python中赋值号和复制的区别。
看了一篇很有帮助的文章,这里附上链接:https://blog.csdn.net/u012768474/article/details/79951518(希望大家都支持原创,禁止恶意转载和抄袭)
里面其实已经很详细的讲述了3者的不同。我这里只做简单的总结:
# encoding: utf-8 ''' @author: ccq @file: differentscopy.py @time: 2019/5/22 9:43 ''' # 赋值号,浅拷贝,深拷贝三者的区别 # 赋值号 a = [1, 2, 3, "hello", ["python", "you"]] b = a b.append(4) print("赋值号:", a, b) # 浅拷贝 c = list(a) c.append("what") print("浅拷贝:", a, c) c[4].append("important") print("浅拷贝2:", a, c) # 深拷贝 import copy d = copy.deepcopy(a) print("深拷贝:", a, d) d.append("deepcopy") print("深拷贝2:", a, d) d[4].append("thedeep") print("深拷贝3:", a, d) # 列表copy e = a.copy() e.append("thee") e[4].append("nomatter") print("列表拷贝:", a, e)赋值号 = :赋值操作不会开辟新的内存空间,它只是复制了新对象的引用。如果有
a=[1,2,3,"hello",["python","you"]] b=a b.append(4) print(a,b)那么结果为:[1, 2, 3, 'hello', ['python', 'you'], 4] [1, 2, 3, 'hello', ['python', 'you'], 4]
简单来说就是当使用赋值号时,注意修改b就是在修改a。(b相当于a的小名)
浅拷贝:我这里使用c=list(a)
c=list(a) c.append("what") print(a,c)那么结果为:[1, 2, 3, 'hello', ['python', 'you'], 4] [1, 2, 3, 'hello', ['python', 'you'], 4, 'what']
可以看到c多了个what,而a没有。(说明c不再是a的小名,而是独立的个体)
但是注意以下情况:
c[4].append("important") print(a,c)代码意思是在列表中的列表里追加元素,此时结果为:
[1, 2, 3, 'hello', ['python', 'you', 'important'], 4] [1, 2, 3, 'hello', ['python', 'you', 'important'], 4, 'what']
可以看到都出现了important这个元素。
这就是浅拷贝与深拷贝的区别。浅拷贝只能拷贝一层。
深拷贝:需要引入copy模块
import copy d = copy.deepcopy(a)再进行追加操作
d.append("deepcopy") print("深拷贝2:", a, d) d[4].append("thedeep") print("深拷贝3:", a, d)可以看到无论是在末尾追加,还是在嵌套列表中追加,都只会改变d不会改变a。
这里补充一个列表拷贝,就是我在day2里说的使用list自带的copy功能
# 列表copy e = a.copy() e.append("thee") e[4].append("nomatter") print("列表拷贝:", a, e)经过测试可以看到,列表拷贝属于浅拷贝的一种,大家以后使用要当心
==========================================分割线==========================================
问题解决,继续
第一个程序
列表循环-listcirculate
# encoding: utf-8 ''' @author: ccq @file: listcirculate.py @time: 2019/5/22 10:26 ''' # 列表循环 list=[1,2,3,4,5,6,7,8,9,10] print(list[0:-1:2]) print(list[::2]) for i in list: print(i)#接着上次的列表操作继续,记录格式
==========================================分割线==========================================
第二个程序
乘法表-multiplicationtables
# encoding: utf-8 ''' @author: ccq @file: multiplicationtables.py @time: 2019/5/22 10:33 ''' # 乘法口诀表 for i in range(1, 10): for j in range(1, i + 1): print(i, "*", j,"=",i*j,end=" ") print("")#权当娱乐
==========================================分割线==========================================
第三个程序
元组-Tuple
# encoding: utf-8 ''' @author: ccq @file: Tuple.py @time: 2019/5/22 15:58 ''' # 元组 tuple = ("apple", "banana", "cat", "dog") print(tuple.count("apple")) print(tuple.index("apple"))#元组只有这两个操作,元组是不可更改的。
==========================================分割线==========================================
第四个程序
购物车-shoppingCart
# encoding: utf-8 ''' @author: ccq @file: ShoppingCart.py @time: 2019/5/22 16:03 ''' # 购物车 ''' 要求: 程序开始时,输入工资,然后打印商品列表 允许用户根据商品编号购买商品 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 可随时退出,退出时,打印已购商品和余额 ''' print("请输入您的工资:") # 输入工资并转换成Int型 salary = int(input()) # 这里使用元组,以防被更改 commoditylist1 = ("1号商品:apple 10元", "2号商品:banana 20元", "3号商品:cat 30元", "4号商品:dog 40元") commoditylist2 = ("1号商品:apple", "2号商品:banana", "3号商品:cat", "4号商品:dog") commodityprice = [10, 20, 30, 40] # 创建一个空的列表 buylist = [] # 进入循环 while True: # 如果余额低于最便宜商品的价格,退出 if salary < 10: print("你没有足够的钱!") print("您的余额为:", salary) break print(commoditylist1) print("你想选择几号商品?") print("输入q退出...") # 读入序号或退出按钮 choice1 = input() # 如果是退出按钮,就退出 if choice1 == "q": break # 不是退出按钮,转换成int型 choice = int(choice1) # 如果输入的商品编号小于1或者大于4,报错 if choice < 1 or choice > 4: print("请输入正确的商品编号!") # 如果是正确的商品编号,判断能否购买 else: # 如果余额不够买商品,报错 if commodityprice[choice - 1] > salary: print("你没有足够的钱!") print("您的余额为:", salary) print() # 这里用continue不用break因为余额可能不够买这件商品,但是也许可以买别的商品,在循环头部加了判断,以防任何商品也买不了 continue else: # 余额足够购买商品,就扣钱,并把买的商品添加到购买栏,打印出购买的商品 salary = salary - commodityprice[choice - 1] buylist.append(commoditylist2[choice - 1]) print("您购买了", choice, "号商品") print() print() # 结束时打印余额和购买的商品 print("您的余额为:", salary) print("您购买了:") for i in buylist: print(i) print("谢谢使用,欢迎下次光临!")#简易的购物车系统,当做练手。一起学习的朋友可以看看开头的要求,自己写一下,进行对比。
==========================================分割线==========================================
今天就学习这么多,加油!