Python三元计算和深浅拷贝
三元计算也称为三目计算,如名字表示的三元运算符需要三个操作数,语法为:三元计算
条件表达式?表达式1:表达式2。 or var = 值1 if 条件 else 值2说明:问号前面的位置是判断的条件,判断结果为bool型,为true时调用表达式1,为false时调用表达式2。 其逻辑为:如果为真执行第一个,否则执行第二个。 例子:
>>> a = 'xxoo' >>> Re = 'xx' if a == 'xxoo' else 'oo' >>> print(Re) xx >>> a = 'xx' >>> Re = 'xx' if a == 'xxoo' else 'oo' >>> print(Re) oo如上结果你可以看成是如下代码的简写的例子:
a = 'xxoo' if a == 'xxoo': Re = 'xx' else: Re = 'oo'这样我想你就知道了!
深浅拷贝分为两部分,一部分是数字和字符串另一部分是列表、元组、字典等其他数据类型。 数字和字符串: 对于数字和字符串而言,赋值、浅拷贝和深拷贝无意义,因为他们的值永远都会指向同一个内存地址,他们就是内存地址的复用。深浅拷贝
>>> import copy # 导入内置copy模块 >>> name = 'lucky' # 命名name变量 >>> id(name) # 查看name变量的内存地址 4426658624 >>> >>> name1 = name # 赋值应用变量 name1 >>> id(name1) # 查看变量name1内存地址 4426658624 >>> >>> name2 = copy.copy(name) # 浅copy name变量赋值给name2变量 >>> id(name2) # 查看name2变量内存地址 4426658624 >>> >>> name3 = copy.deepcopy(name) # 深copy name变量复制给name2变量 >>> id(name3) # 查看name3变量的内存地址 4426658624 >>> >>> print(name, name1, name2, name3) # 打印四个变量的值 lucky lucky lucky lucky如上结果可以看出,不管是直接引用还是深浅copy其最后的结果变量的内存地址都没有变,只是定义的方法不一样,如下图示: [attach]1338[/attach] 其他数据类型: 对于字典、元祖、列表 而言,进行赋值、浅拷贝和深拷贝时,内存地址可能会发生相应的变化。 1、赋值
>>> num1 = {'n1': 1, 'n2': 2, 'n3': [3, 4]} >>> num2 = num1 >>> print(id(num1), id(num2)) 4424864840 4424864840 >>> >>> num1['n1'] = 7 >>> print(id(num1), id(num2)) 4424864840 4424864840 >>> print(num1, num2) {'n2': 2, 'n3': [3, 4], 'n1': 7} {'n2': 2, 'n3': [3, 4], 'n1': 7} >>> >>> num1['n3'][0] = 9 >>> print(id(num1), id(num2)) 4424864840 4424864840 >>> print(num1, num2) {'n2': 2, 'n3': [9, 4], 'n1': 7} {'n2': 2, 'n3': [9, 4], 'n1': 7}如上所示,不管怎么改变原始的info字典内容,哪怕是改变里面的列表元素值,而info2的内容随之变化,运维他们的引用的内存地址是一样的,图示如下: [attach]1339[/attach] 2、浅拷贝 浅拷贝,在内存中只额外创建第一层数据,里面则是完全复制。
>>> num1 = {'n1': 1, 'n2': 2, 'n3': [3, 4]} >>> num2 = num1.copy() >>> print(id(num1), id(num2)) 4426663432 4426602824 >>> print(id(num1['n1']), id(num2['n1'])) 4423026704 4423026704 >>> print(id(num1['n3']), id(num2['n3'])) 4427044168 4427044168 >>> print(id(num1['n3'][0]), id(num2['n3'][0])) 4423026768 4423026768 >>> num1['n3'][0] = 9 >>> print(id(num1), id(num2)) 4426663432 4426602824 >>> print(num1, num2) {'n2': 2, 'n3': [9, 4], 'n1': 1} {'n2': 2, 'n3': [9, 4], 'n1': 1} >>> num1['n1'] = 19 >>> print(num1, num2) {'n2': 2, 'n3': [9, 4], 'n1': 19} {'n2': 2, 'n3': [9, 4], 'n1': 1} >>> print(id(num1['n3'][0]), id(num2['n3'][0])) 4423026960 4423026960浅copy也可以利用copy模块 num2 = copy.copy(num1) 图示如下: [attach]1340[/attach] 3、深拷贝 深拷贝,在内存中将所有的数据重新创建一份(排除最后一层,即:python内部对字符串和数字的优化)
>>> num1 = {'n1': 1, 'n2': 2, 'n3': [3, 4]} >>> num2 = copy.deepcopy(num1) >>> print(id(num1), id(num2)) 4424864840 4427043656 >>> print(id(num1['n1']), id(num2['n1'])) 4423026704 4423026704 >>> print(id(num1['n3']), id(num2['n3'])) 4427043592 4426939976 >>> num1['n1'] = 9 >>> print(id(num1['n1']), id(num2['n1'])) 4423026960 4423026704从上面来看,深copy内存地址则完全不一样,图示如下: [attach]1341[/attach]