Python基础数据类型补充及深浅拷贝

-*-coding:utf-8 -*-
ascii 不支持中文
gbk 支持中文 2个字节 包含ascii码
unicode 万国码 python3 内存unicode
utf-8 可变的长 英文 1 字节 欧洲2个字节 亚洲3个字节

unicode 内存
硬盘 utf-8 字节 存储 传送

s = '澳门'
a = 'alexsb'
s1 = s.encode('utf-8') # 编码 编码集
print(s1) # b'xe6xbexb3xe9x97xa8'
print(s1.decode('utf-8'))
a1 = a.encode('utf-8') # b'alexsb'
print(a1)
s2 = s.encode('gbk')
print(s2) # b'xb0xc4xc3xc5'
a2 = a.encode('gbk') # b'alexsb'
print(a2)
s3 = s.encode('utf-8')
print(s3.decode('gbk')) # 不能使得

s = 'alex'
s1 = s.encode('utf-8') # 编码 utf-8 包含了ascii
print(s1.decode('gbk')) # 解码 gbk 包含了ascii

应用场景: 文件操作 网络传输 网络编程

坑 基础数据补充

li = [1,2,3,4,5,0,0,0,0,0,0,0,0,0]

for i in li:
li.append(0)
print(li) # [1,2,3,4,5,0,0,0,0,0]

li = [12,2,3,4,5]
for i in li:
li.append(i)
print(li)
print(li)


for i in li:
li.remove(i)
print(li) # 结果[2,4]

for i in li:
li.pop()
print(li)



li = [1,2,3,4,5]
for i in li:
del li[-1]
print(li)





for i in range(len(li)): # 行
li.pop()
print(li)

li = [1,2,3,4,5] # 行
l2 = []
for i in li:
l2.append(i)
for j in l2:
li.remove(j)
print(li)

for i in li:
li.clear() # 实在不行的
print(li)

dic = {'1':22,'5':'22'}
for i in dic:
dic['6'] = 1
print(dic)

lst = []
for i in dic:
lst.append(i) # 每个字典的键
for j in lst:
dic.pop(j)
print(dic)


dic = dict.fromkeys('年后啊','消愁')

第一个位置是可迭代对象,也就是字典的键
第二个位置 不写是None 也就是字典的值

print(dic)
dic['年'] = '今天老子不上班' # 字符串不能修改
print(dic)

dic['你'] = [5,6,7]
print(dic)
dic = dict.fromkeys('你好啊',[1,2,3])
print(dic)
dic['你'].append(99)
print(dic)

深浅拷贝

li = [1,2,3,4]
lst = li.copy()
print(li)
print(lst)

print(id(li)) # 34512776
print(id(lst)) # 34512840

li[0] = 56
print(li) # 变
print(lst) # 不变



print(id(li[0])) # 1548382960
print(id(lst[0])) # 1548381200

print(id(li[1])) # 1548381232
print(id(lst[1])) # 1548381232


li = [1,2,3,4,[5,6,7]] # 浅拷贝只拷贝一层元素
lst = li.copy()
# print(li)
# print(lst)

li[-1].append(90)
print(li) # 变
print(lst) # 变

print(id(li[-1]))
print(id(lst[-1]))


li = [1,2,3,4] # 赋值
lst = li
print(li)
print(lst)

li[0] = 56
print(li)
print(lst)

import copy

li = [1,2,3,4,[5,6,7]]
lst = copy.deepcopy(li) # 深拷贝
# 浅拷贝只拷贝第一层元素,元素是不可变的,就不会变 元素是可变的俩个同时变
print(li)
print(lst)
print(id(li)) # 40289984
print(id(lst)) # 40305368

li[-1].append(90)
print(li) # 变
print(lst) # 不变

print(id(li[-1])) #38783856
print(id(lst[-1])) #38798000

import copy

li = [1,2,3,4,[5,6,7]]

lst = copy.deepcopy(li)

print(id(lst[-2])) # 39584432
print(id(li[-2])) # 39570288

面试题:

li = [1,2] # li = [1,[1,[1,[1,2]]]]
li[1] = li
print(li)
结果 [1, [...]]

is == 区别

a = 1000
b = 1000
print(a == b)
print(id(a))
print(id(b))
print(a is b) # is 是

== 比较两边的值 # 看这俩人是不是长得一样
is 比较两边的内存地址 # 判断是不是一个 身份证号


代码块

def func():
a = 'asd@fasdf'* 20
print(id(a))
def func1():
b = 'asd@fasdf'* 20
print(id(b))
print(func(),func1())

a = 100000000
b = 100000000
c = 100000000
d = 100000000

一个文件就是一个代码块:

print(a is b) # 节省资源


代码块机制:

数字: -5 ~ 256
字符串: 乘法的时候总长度不能超过20

代码块 > 小数据

s = '222222222222222222222222222222222222222222222222222222'
f = '222222222222222222222222222222222222222222222222222222'

print(s is f)

s = 'asdsr' * -50
d = 'asdsr' * -50
print(s is d)

a = '12221341asdfadsfasxzvdasfasdfewfwfvxasgfrqegvewrgavrgvaerg'
b = '12221341asdfadsfasxzvdasfasdfewfwfvxasgfrqegvewrgavrgvaerg'

a = '@'* 2
b = '@'* 2

原文地址:https://www.cnblogs.com/YZL2333/p/10226453.html