本文共 1992 字,大约阅读时间需要 6 分钟。
在Python3中对于数组、字符串的 * 表示对原数组、字符串的复制,所以 a * 2 表示对列表a的复制,结果为 [2,3,2,3]而且在Python3中字符串、列表和元组支持此种方法复制数据,字典和集合不行
在python中, 如果用一个列表a乘一个数字会得到一个新的列表b, 这个新的列表b的元素是a的元素重复n次。
a = [1,2]b = a * 2 # [1, 2, 1, 2]
此外还要注意一点,当a中的元素为引用类型时,如:
a = [[1,2]]b = a * 2 # b -> [[1, 2], [1, 2]]
修改b[0][0], b[0][1]同样被修改了, 这是因为b[0]与b[1]有相同的地址
b[0][0] = 3print(b) # [[3, 2], [3, 2]]
打印b[0]和b[1]的 id
print(id(b[0])) # 1904838110536print(id(b[1])) # 1904838110536
python中常见False的情况:None,False,空字符串"",0,空列表[],空字典{},空元组()
一个模块中有__name__
random.random()生成0和1之间的随机浮点数float
import copyd = { '1': [1, 1, 1], '2': 2}copy1 = dcopy2 = d.copy()copy3 = copy.copy(d)copy4 = copy.deepcopy(d)d['1'][0] = 3 d['2'] = 3 print(copy1, copy2, copy3, copy4)'''打印结果分比为{'1': [3, 1, 1], '2': 3} {'1': [3, 1, 1], '2': 2} {'1': [3, 1, 1], '2': 2} {'1': [1, 1, 1], '2': 2}'''
方法1:赋值引用,copy1和d指向同一个对象
方法2:浅复制,复制生成新对象copy2,但是只复制一层,[1, 1, 1]为两者共同子对象,
方法3:浅复制,调用copy模块中的方法,同方法2
方法3:深复制,复制生成新对象copy4,并且递归复制所有子对象,所以d中原来指向[1, 1, 1]的改动不会影响深复制生成的子对象[1, 1, 1]
a = { '1':1,'2':2,'3':[1,2],4:'abc'}
b = a.copy()和b=copy.copy(a)都属于浅拷贝
当a/b中的不可改变数据:int类型、string类型、tuple类型发生改变时候,不影响到另一个。
但其它的情况下,如更改列表元素,会发生互相影响。
举例:
①不可变数据改变举例
对int改变:
a = { '1':1,'2':2,'3':[1,2],'4':'abc'} b = a.copy() a['1']=250 print(a) print(b) out: '''{'1': 250, '2': 2, '3': [1, 2], '4': 'abc'}{'1': 1, '2': 2, '3': [1, 2], 4: 'abc'}'''
对string改变:
a = { '1':1,'2':2,'3':[1,2],'4':'abc'} b = a.copy() a['4']='def' print(a) print(b) out: '''{'1': 1, '2': 2, '3': [1, 2], '4': 'def'}{'1': 1, '2': 2, '3': [1, 2], '4': 'abc'}'''
对tuple改变:
a = { '1':1,'2':2,'3':[1,2],'4':'abc'} b = a.copy() a['3']=[1,2,3] print(a) print(b) '''{'1': 1, '2': 2, '3': [1, 2, 3], '4': 'abc'}{'1': 1, '2': 2, '3': [1, 2], '4': 'abc'}'''
②可变数据改变举例
a = { '1':1,'2':2,'3':[1,2],'4':'abc'} b = a.copy() a['3'][0]=2 print(a) print(b) '''{'1': 1, '2': 2, '3': [2, 2], '4': 'abc'}{'1': 1, '2': 2, '3': [2, 2], '4': 'abc'}'''
转载地址:http://vzeuuy.baihongyu.com/