day5_不能循环删除list-深拷贝、浅拷贝(import copy)

一、循环删list里面的元素,会导致下标错位,结果是不对的举例:想删除奇数

l = [1,1,1,2,3,4,5]
for i in l:
    if i%2 !=0:
        l.remove(i)  #删除后,导致下标错位了,有的值被错过了不会被删除。
print(l)

 

结果:

[1, 2, 4]

 可解决方式:

l = [1,1,1,2,3,4,5]
l2 = [1,1,1,2,3,4,5] #在定义个l2和l相同
for i in l2: #循环的是l2
    if i%2 !=0:
        l.remove(i)  #删除的是l
print(l)

结果:

[2, 4]

list里面的copy()方法也是浅拷贝

 

引发出问-深拷贝、浅拷贝

二、深拷贝、浅拷贝

 

深拷贝会开辟新的内存地址,浅拷贝不会用一个内存地址

l = [1,1,1,2,3,4,5] #跟深拷贝一样
l2 =l #浅拷贝#这种不行,l存的实际是内存地址,l2又定义了个变量,把l赋值给l2,说明l2指向的内存地址和l相同。l删除后,l2也删除了,因为用的是一块儿内存地址
查看内存地址;print(id(l))
import copy  #引入模块-深拷贝功能

1、‘=’:用等号来赋值,新的变量和原来的变量实际上指向的是同一个地址,等号连接起来的变量互相影响

2、浅拷贝copy

注:import copy后使用的copy函数和python自带的copy函数作用是相同的(copy.copy(x)=x.copy())

拷贝原list变量的第一层,之后对新变量或者旧变量的第一层的修改不会影响到彼此,第二层以及更多层之间则是像第一中操作中一样,是互相影响的。什么是第一层呢

l =[1,2,[3,4]]

那么1,2,[3,4]都属于第一层的元素,在新变零中修改第一层的元素不会影响到原变量,同样,在原变量中修改第一层的元素也不会影响到新变量;而3,4属于第第二层中的元素,对他们修改会影响到用浅拷贝连接起来的所有变量中的第二层元素: 

修改原变量观察对新变量的影响:

import copy
l =[1,2,[3,4]]
l2 = copy.copy(l) #copy()函数,
l3   = l.copy()  #列表自带的copy()方法
l[0] =0
l[2][0]=9
print('l=',l)
print('l2=',l2)
print('l3 =',l3)

输出:

l= [0, 2, [9, 4]]
l2= [1, 2, [9, 4]]
l3 = [1, 2, [9, 4]]

修改新变量,对原变量的影响:

l =[1,2,[3,4]]
l2 = copy.copy(l) #copy()函数,
l3   = l.copy()  #列表自带的copy()方法
l2[0] =0
l2[2][0]=9
print('l=',l)
print('l2=',l2)
print('l3 =',l3)

输出:

l= [1, 2, [9, 4]]
l2= [0, 2, [9, 4]]
l3 = [1, 2, [9, 4]]

 

 

3、深拷贝deepcopy

复制出来的与原来的变量没有任何关系,最清爽的复制

import copy
l = [1,1,1,2,3,4,5]
l2 = copy.deepcopy(l) #深拷贝
print(id(l))
print(id(l2))

结果:

18649160
18553288

 

字符串/元组的拷贝问题说明:字符串是不可变的。

a = '小黑'
b = a  #重新开辟了新内存,不会像list一样,和a用一个内存地址
a = '小白' #a重新复制不会互相影响
print(a)
print(b)

输出:

小白
小黑

 

posted on 2018-09-14 07:08  羽竹  阅读(365)  评论(0编辑  收藏  举报