python基础篇 05-字符串切片 深copy

#切片是list范围取值的一种方式

import string
print(string.ascii_lowercase)       #所以的小写字母    abcdefghijklmnopqrstuvwxyz
print(string.ascii_uppercase)       #所以的大写字母    ABCDEFGHIJKLMNOPQRSTUVWXYZ
print(string.digits)                # 所有的数字   0123456789
print(string.ascii_letters)         # 所有的大小写字母  abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
print(string.punctuation)           # 所有的特殊字符  !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~


"""
切片 很重要
"""
#    0     1    2    3   4    5     6   7    8
l = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']    #切片的时候是顾头不顾尾的
#   -9    -8    -7   -6   -5   -4   -3   -2   -1
print(l[2:]) #取到末尾
print(l[2:-1]) #最后一个元素取不到
print(l[:]) #取所有元素
print(l[0:9:2]) #步长
print(l[::-1])  #如果是负数的话,那么取值的时候就从右往左开始取,同时你的开始和结束下标也要写成负数
print(l[-1:-4:-1])   #倒着数,第一个表示从最右边开始的位置,第二个表示 结束的位置 同样 顾头不顾尾 ['i', 'h', 'g']

s='abcdef'
print(s[::-1])   #倒着取 相当于字符反转



"""
    浅拷贝 深拷贝  非常重要  非常重要  非常重要
"""

# 循环删除list中元素,导致下标错乱
l1 = [1,0,4,2,5,4,7,6,9,8]
for i in l1:
    print("====="+str(i))
    print(l1)
    if i % 2 == 0 :
        l1.remove(i)                # 删除第一次出现的元素
        print("++++"+str(i))
print(l1)


import copy
# print(list(range(10)))
#    0  1  2 3  4  5  6
l = [0, 1, 2,2, 3, 4, 5]
l2 = copy.deepcopy(l)  #深拷贝 重新开辟内存空间 生成新的变量
l3 = l.copy()           #  半深拷贝,只开辟了一层地址,子内存地址没有新生成,简而言之:拷贝不彻底,只拷贝了一层,没有拷贝子元素的地址,杜绝使用

print(id(l))            # 查看内存地址
print(id(l2))
print(id(l3))

for i in l2:
    if i % 2 == 0:
        l.remove(i)
print(l)


l = [ 1,2,3,[4,5,6] ]
l2 = l.copy()         # 浅拷贝 杜绝使用
l2 = copy.copy(l)     # 浅拷贝 杜绝使用
l2 = l[:]             # 浅拷贝 杜绝使用

print(id(l))
print(id(l2))
l[-1].append('abc')
print(l)
print(l2)

#浅拷贝/深拷贝 #如果复制了一个变量,这两个变量其中一个变了之后,不应该影响另外一个的情况下,就要用深拷贝

 

posted @ 2021-09-02 20:37  捞铁  Views(51)  Comments(0Edit  收藏  举报