第二章- 补充内容

第二章- 补充内容


2.6 代码块


2.6.1 代码块


Python程序是由代码块构造而成的。块是一个python程序的文本,他是作为一个单元执行的。

代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块。

而作为交互方式输入的每个命令都是一个代码块。

然而当我们在文件中创建两个函数或者类,那么这两个函数体就是不同的代码块。


2.6.2 代码块的缓存机制


1、缓存机制

Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。

换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。所以在你给出的例子中,文件执行时(同一个代码块)会把i1、i2两个变量指向同一个对象,满足缓存机制则他们在内存中只存在一个,即:id相同。

这里我们可以使用id()来查看一个对象的内存地址。

a1 = 1
a2 = 1

print(id(a1))   # 2228733870320
print(id(a2))   # 2228733870320

2、 缓存机制的应用类型

当然缓存机制也是有应用类型的

  • int(float):任何数字在同一代码块下都会复用。

  • bool:True和False在字典中会以1,0方式存在,并且复用。

  • str:几乎所有的字符串都会符合缓存机制,

3、 缓存机制的优点

能够提高一些字符串,整数处理人物在时间和空间上的性能;需要值相同的字符串,整数的时候,直接从‘字典’中取出复用,避免频繁的创建和销毁,提升效率,节约内存。




2.7 小数据池


2.7.1 小数据池概念

小数据池,不同代码块的缓存机制,也称为小整数缓存机制,或者称为驻留机制等等,

那么到底什么是小数据池?他有什么作用呢?

Python中,在不同一个代码块内,对于整数,字符串的小数据池是这么说的:

Python自动将-5~256的整数进行了缓存,当你将这些整数赋值给变量时,并不会重新创建对象,而是使用已经创建好的缓存对象。

python会将一定规则的字符串在字符串驻留池中,创建一份,当你将这些字符串赋值给变量时,并不会重新创建对象, 而是使用在字符串驻留池中创建好的对象。

其实,无论是缓存还是字符串驻留池,都是python做的一个优化,就是将~5-256的整数,和一定规则的字符串,放在一个‘池’(容器,或者字典)中,无论程序中那些变量指向这些范围内的整数或者字符串,那么他直接在这个‘池’中引用,言外之意,就是内存中之创建一个。

2.7.2 小数据池特性


1、优缺点:

优点 :能够提高字符串、整数的处理速度。省略了创建对象的过程。(节省内存、提高性能和效率)

缺点 :在"池"中创建或者插入新的内容会花费更多的时间。

2、 适用对象: int(float),str,bool

int:那么大家都知道对于整数来说,小数据池的范围是-5~256 ,如果多个变量都是指向同一个(在这个范围内的)数字,他们在内存中指向的都是一个内存地址。

str:字符串要从下面这几个大方向讨论:

1、字符串的长度为0或者1,默认都采用了驻留机制(小数据池)。

2、字符串的长度>1,且只含有大小写字母,数字,下划线时,才会默认驻留。

3、用乘法得到的字符串,分两种情况。

  • 乘数为1时:仅含大小写字母,数字,下划线,默认驻留。

含其他字符,长度<=1,默认驻留。

含其他字符,长度>1,默认驻留。

  • 乘数>=2时:

仅含大小写字母,数字,下划线,总长度<=20,默认驻留。

4、指定驻留。

from sys import intern
a = intern('hello!@'*20)
b = intern('hello!@'*20)
print(a is b)

#指定驻留是你可以指定任意的字符串加入到小数据池中,让其只在内存中创建一个对象,多个变量都是指向这一个字符串。

满足以上字符串的规则时,就符合小数据池的概念。

bool值就是True,False,无论你创建多少个变量指向True,False,那么他在内存中只存在一个。

看一下用了小数据池(驻留机制)的效率有多高:

显而易见,节省大量内存在字符串比较时,非驻留比较效率o(n),驻留时比较效率o(1)。

优点:能够提高一些字符串,整数处理人物在时间和空间上的性能;需要值相同的字符串,整数的时候,直接从‘池’里拿来用,避免频繁的创建和销毁,提升效率,节约内存


2.7.3 垃圾回收

1、 垃圾回收器

不在被引用的内存会被垃圾回收器(Garbage Collection,GC)自动回收。

垃圾回收器是一块独立的代码,专门用来寻找和销毁引用计数为0的对象,同时也会检查引用计数大于0单也应该被销毁的对象。

python采用的是引用计数机制为主, “标记-清除"“分代收集(隔代回收)” 两种机制为辅的策略。

2、 引用计数机制

python中为了能够知道当前这个对象有多少变量指向它,因此会在每个对象中有一个小空间用于存放引用计数。

a = 1
b = a
  • 计数器增加
a=14  # 对象被创建  
b=a   # 对象被引用 
func(a)   # 对象被作为参数,传到函数中
List=[a,"a","b",2]   # 对象作为一个元素,存储在容器中   
b = 9999 # 引用计数器的值为1
c = b  # 引用计数器的值为2
  • 计数器减少
# 当该对象的别名被显式销毁时        del a
# 当该对象的引别名被赋予新的对象,   a=26
# 一个对象离开它的作用域,例如 func函数执行完毕时,函数里面的局部变量的引用计数器就会减一(但是全局变量不会)
# 将该元素从容器中删除时,或者容器被销毁时。

a = 999
b = a  # 当前计数器为2
del b # 删除变量b:b对应的对象的引用计数器-1   (此时计数器为1)
del a # 删除变量a:a对应的对象的引用计数器-1    (此时引用计数器为0)

# 当引用计数器为0 时,意味着没有人再使用这个对象,这个对象就变成垃圾,垃圾回收。
# 回收:1.对象从refchain的链表移除。
# #2.将对象进行销毁,内存归还给操作系统,可用内存就增加。

引用计数机制使用比较简单,并且一旦没有引用,内存就直接释放了。

a = 1   # 创建对象并初始化引用计数器为1
b = a   # 计数器+1
c = a   # 计数器+1

# 此时对1的引用计数结束,又回到0,所以将会被回收。 

d = 2

但是引用计数机制会消耗内存,当在循环引用时,光靠引用计数来管理内存是不够的。

v1 = [1,2,3]        # refchain中创建一个列表对象,由于v1=对象,所以列表引对象用计数器为1.
v2 = [4,5,6]        # refchain中再创建一个列表对象,因v2=对象,所以列表对象引用计数器为1.
v1.append(v2)        # 把v2追加到v1中,则v2对应的[4,5,6]对象的引用计数器加1,最终为2.
v2.append(v1)        # 把v1追加到v1中,则v1对应的[1,2,3]对象的引用计数器加1,最终为2.

del v1    # 引用计数器-1
del v2    # 引用计数器-1

#最终v1,v2引用计数器都是1

当对象的引用计数并没有归零,会一直驻留在内存中,造成内存溢出。

为了解决这个问题,Python又引用了“标记-清除”和“分代回收”两种机制来辅助内存管理

2、 标记-清除

标记清除(Mark—Sweep)】算法是一种基于追踪回收(tracing GC)技术实现的垃圾回收算法。它分为两个阶段:第一阶段是标记阶段,GC会把所有的『活动对象』打上标记,第二阶段是把那些没有标记的对象『非活动对象』进行回收。那么GC又是如何判断哪些是活动对象哪些是非活动对象的呢?

对象之间通过引用(指针)连在一起,构成一个有向图,对象构成这个有向图的节点,而引用关系构成这个有向图的边。从根对象(root object)出发,沿着有向边遍历对象,可达的(reachable)对象标记为活动对象,不可达的对象就是要被清除的非活动对象。根对象就是全局变量、调用栈、寄存器。

在上图中,我们把小黑点视为全局变量,也就是把它作为root object,从小黑点出发,对象1可直达,那么它将被标记,对象2、3可间接到达也会被标记,而4和5不可达,那么1、2、3就是活动对象,4和5是非活动对象会被GC回收。

3、 分代收集(隔代回收)

“分代回收”是一种用空间换时间的回收方式。Python将对象分为3个“代”,3个代分别为:0代、1代、2代,每个代对应一个集合。新创建的对象就放入0代,当0代的集合存放不下新对象的时候,就出发一次GC,能回收对象就回收,不能回收的就将其移动到第1代。当第1代的空间也存不下新移入的的对象时,就再出发一次回收,这次回收不了的对象就移动到第2代。第2代是程序运行中存活时间最长的对象,甚至会等到程序退出空间才会被释放。




2.8 深浅copy


2.8.1 深浅copy概念

深浅copy其实就是完全复制一份,和部分复制一份的意思。

lst = [1,2,3,[6,7,8]]

我们创建了一个列表,在列表在内存中变化如下图:

image


2.8.2 浅copy

浅拷贝就是仅复制第一层元素

lst = [1,2,3,[6,7,8]]
# lst2 = lst[:] # 浅拷贝
lst2 = lst.copy()

image

这样就是浅拷贝,浅拷贝只把原列表中记录的内存地址拿到一个新开辟的列表中

lst = [1,2,3,[6,7,8]]
lst2 = lst[:]
lst.append(9)

image

为什么lst2中没有添加,是因为咱们先进行的浅拷贝,浅拷贝把原列表中有的内存地址复制了一份放到新开辟的空间中,后期对原列表添加的内容新列表是不会有的,再看看下边的例子

lst = [1,2,3,[6,7,8]]
lst2 = lst.copy()
lst[1] = "22"

image

我们修改成字符串"22" 就是在列表中将以前的内存地址更换成新开辟的空间地址

lst = [1,2,3,[6,7,8]]
lst1 = lst.copy()
lst[-1].append(9)

image

因为我们对里边的列表进行修改,列表本身就是可变的数据类型,我们通过原列表修改最里层的小列表,小列表进行变化,新开辟的列表里存放就是小列表中的内存地址.在去查看的时候就有变动

2.8.3 深copy

深copy是将所有元素都复制到一个新的内存中

import copy
lst = [1,2,3,[6,7,8]]
lst2 = copy.deepcopy(lst)

image

我们通过上图可以发现浅拷贝和深拷贝在最后列表的位置内存地址不一样,深拷贝是自己单独开辟了一个新的空间,我们现在修改原列表和新开辟的列表没有任何影响。

2.8.4 总结

  • 赋值:
两个或多个变量名指向同一个内存地址,有一个操作内存地址的值进行改变,其余的变量名在查看的时候都进行更改
  • 浅拷贝:
只拷贝列表中第一层的内存地址,原列表修改了不可变数据类型,新开辟的列表不进行变动,因为只是在原列表中将内存地址进行修改了,新开辟的列表中的内存地址还是用的之前的内存地址

原列表对可变数据类型进行了添加,新开辟的列表中存放就是可变数据类型的地址,在去查看的时候就发现进行更改了
  • 深拷贝:
不管你修改原数据的不可变类型还是可变类型,新开辟的空间中都不会进行改变,因为可变数据类型新开辟了一个空间

2.9 编码知识


2.9.1 编码

咱们的电脑,存储和发送文件,发送的是什么?电脑里面是不是有成千上万个二极管,亮的代表是1,不亮的代表是0,这样实际上电脑的存储和发送是不是都是010101啊

我们发送的内容都是010101010这样写的内容比较多就不知道是什么了,所以我们想要明确的区分出来发送的内容就需要

在某个地方进行分段.计算机中设定的就是8位一断句

1、 ASCII

ASCII(American Standard Code for Information Interchange,美国信息互换标准代码,ASCⅡ)是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。

ASCII第一次以规范标准的型态发表是在1967年,最后一次更新则是在1986年,至今为止共定义了128个字符,其中33个字符无法显示(这是以现今操作系统为依归,但在DOS模式下可显示出一些诸如笑脸、扑克牌花式等8-bit符号),且这33个字符多数都已是陈废的控制字符,控制字符的用途主要是用来操控已经处理过的文字,在33个字符之外的是95个可显示的字符,包含用键盘敲下空白键所产生的空白字符也算1个可显示字符(显示为空白)。

计算机:

    储存文件,或者是传输文件,实际上是010101010

    计算机创建初期,美国,是7位一段,但是发明者说为了拓展,留出一位,这样就是8位一段句。8位有多少种可能 ?256

    密码本:

    ascii

         00000001

         01000001 01000010 01000011   ABC

随着计算机的发展,以及普及率的提高,流⾏到欧洲和亚洲,这时ASCII码就不合适了,比如:中⽂汉字有几万个, 而ASCII多也就256个位置,所以ASCII不行了,怎么办呢?这时,不同的国家就提出了不同的编码用来适用于各自的语言环境。比如, 中国的GBK, GB2312, BIG5, ISO-8859-1等等. 这时各个国家都可以使用计算机了.

2、 GBK

GBK全称《汉字内码扩展规范》(GBK即“国标”、“扩展”汉语拼音的第一个字母,英文名称:Chinese Internal Code Specification) ,中华人民共和国全国信息技术标准化技术委员会1995年12月1日制订,国家技术监督局标准化司、电子工业部科技与质量监督司1995年12月15日联合以技监标函1995 229号文件的形式,将它确定为技术规范指导性文件。这一版的GBK规范为1.0版。

GBK 向下与 GB 2312 编码兼容,向上支持 ISO 10646.1国际标准,是前者向后者过渡过程中的一个承上启下的产物。ISO 10646 是国际标准化组织 ISO 公布的一个编码标准,即 Universal Multilpe-Octet Coded Character Set(简称UCS),大陆译为《通用多八位编码字符集》,台湾译为《广用多八位元编码字元集》,它与 Unicode 组织的 Unicode 编码完全兼容。ISO 10646.1 是该标准的第一部分《体系结构与基本多文种平面》。我国 1993 年以 GB 13000.1 国家标准的形式予以认可(即 GB 13000.1 等同于 ISO 10646.1)。

GBK编码,是在GB2312-80标准基础上的内码扩展规范,使用了双字节编码方案,其编码范围从8140至FEFE(剔除xx7F),共23940个码位,共收录了21003个汉字,完全兼容GB2312-80标准,支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字,并包含了BIG5编码中的所有汉字。GBK编码方案于1995年10月制定, 1995年12月正式发布,目前中文版的WIN95、WIN98、WINDOWS NT以及WINDOWS 2000、WINDOWS XP、WIN 7等都支持GBK编码方案。

GBK, 国标码占用2个字节,对应ASCII码 GBK直接兼容,因为计算机底层是用英文写的,你不支持英文肯定不行,而英文已经使用了ASCII码,所以GBK要兼容ASCII,这里GBK国标码,前⾯的ASCII码部分,由于使⽤两个字节,所以对于ASCII码⽽言,前9位都是0。

字母A:0100 0001 # ASCII
字母A:0000 0000 0100 0001 # 国标码

随着全球化的普及,发展到欧洲,亚洲等国家,发现这些根本不够用,所以创建了万国码。 因为全球语言很多,ascii不足以存储这么多对应关系,创建了一个超级密码本:万国码unicode

8 位 == 1个字节.
hello h一个字符,e一个字符,he就不是一个字符.
中国:中是一个字符,国是一个字符.

3、 Unicode

Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。

​创建之初,16位,2个字节,表示一个字符。
英文: “a b c” 六个字节,一个英文2个字节,
​中文:“中国” 四个字节, 一个中文用2个字节。

但是这种也不行,这种最多有65535种可能,可是中国文字有9万多,所以改成 32位,4个字节,表示一个字符.

​ a 01000001 01000010 01000011 00000001 ​ b 01000001 01000010 01100011 00000001 ​ 中 01001001 01000010 01100011 00000001 ​ 浪费资源.

4、 UTF-8

UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码,由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个字节编码Unicode字符。用在网页上可以统一页面显示中文简体繁体及其它语言(如英文,日文,韩文)。

对Unicode进行升级:utf-8 用最少用8位数,去表示一个字符。

英文: 8位,1个字节表示。

欧洲文字: 16位,两个字节表示一个字符。

中文,亚洲文字: 24位,三个字节表示。

utf-16 用最少用16位数。

gbk: 国标,只能中国人自己用, 一个中文用16位,两个字节表示。

5、 单位转化

8bit = 1byte
1024byte = 1KB
1024KB = 1MB
1024MB = 1GB
1024GB = 1TB
1024TB = 1PB
1024TB = 1EB
1024EB = 1ZB
1024ZB = 1YB
1024YB = 1NB
1024NB = 1DB
常⽤到TB就够了


2.9.2 编码之间转换


在计算机内存中,统一使用Unicode编码,当需要将数据保存到硬盘或者需要网络传输的时候,就转换为非Unicode编码比如:UTF-8编码。

举个例子:用文件编辑器(word,wps,等)编辑文件的时候,从文件将你的数据(此时你的数据是非Unicode(可能是UTF-8,也可能是gbk,这个编码取决于你的编辑器设置))字符被转换为Unicode字符读到内存里,进行相应的编辑,编辑完成后,保存的时候再把Unicode转换为非Unicode(UTF-8,GBK 等)保存到文件。

不同编码之间,不能直接互相识别。

比如你的一个数据:‘老铁没毛病’是以utf-8的编码方式编码并发送给一个朋友,那么你发送的肯定是通过utf-8的编码转化成的二进制01010101,那么你的朋友接收到你发的这个数据,他如果想查看这个数据必须将01010101转化成汉字,才可以查看,那么此时那也必须通过utf-8编码反转回去,如果要是通过gbk编码反转,那么这个内容可能会出现乱码或者报错。

1、 str --> bytes

# encode称作编码:将 str 转化成 bytes类型
s1 = '中国'
b1 = s1.encode('utf-8')  # 转化成utf-8的bytes类型
print(s1)  # 中国
print(b1)  # b'\xe4\xb8\xad\xe5\x9b\xbd'

s1 = '中国'
b1 = s1.encode('gbk')  # 转化成gbk的bytes类型
print(s1)  # 中国
print(b1)  # b'\xd6\xd0\xb9\xfa'

2、 bytes --> str

# decode称作解码, 将 bytes 转化成 str类型
b1 = b'\xe4\xb8\xad\xe5\x9b\xbd'
s1 = b1.decode('utf-8')
print(s1)  # 中国

3、 gbk 与 utf-8的转换

当我们需要将gbk编码的bytes如何转化成utf-8编码的bytes。

不同编码之间是不能直接互相是别的,这里说了不能直接,那就可以间接,如何间接呢? 现存世上的所有的编码都和谁有关系呢? 都和万国码Unicode有关系,所以需要借助Unicode进行转换。


内容参考:

https://blog.csdn.net/m0_51691302/article/details/123117569

https://www.cnblogs.com/jin-xin/articles/9439483.html

https://guobaoyuan.gitee.io/book/Python/6-0%20%E5%B0%8F%E6%95%B0%E6%8D%AE%E6%B1%A0.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 《最优化方法》是一本经典的优化理论和方法教材,作者是孙文瑜教授。这本书已经有第二版的PDF电子版。在这本书中,孙文瑜教授系统地介绍了各种最优化方法和算法,涵盖了线性规划、非线性规划、凸优化、整数规划等重要内容。 这本书的第二版是在第一版的基础上进行了修订和更新。作者根据读者的反馈和最新的研究成果,对内容进行了补充和改进,使得这本书更加完善和全面。第二版的PDF版本使得读者可以方便地在线获取和阅读这本书。 《最优化方法》的第二版PDF包含了丰富的教学资源,如章节习题、课后答案和习题解析等。这些资源可以帮助读者更好地理解和应用书中的理论知识,并进行相关的练习和实践。此外,第二版还增加了一些实例和应用场景,帮助读者将所学的优化方法应用到实际问题中。 通过研读《最优化方法》,读者可以系统地学习和掌握最优化方法的基本原理和应用技巧。这对于从事优化相关研究和工作的人员来说,具有重要的指导意义。无论是学术研究还是工程实践,都需要对最优化方法有深入的了解和熟练的运用。 最后,值得一提的是,虽然《最优化方法》第二版PDF为读者提供了方便的获取途径,但实体书籍同样对于学习和研究有着重要的作用。实体书籍的鲜活感和阅读体验能够更好地激发读者的学习兴趣和思考能力。因此,可以将PDF版本作为参考和补充,但建议还是尝试购买实体书籍来更好地学习和使用《最优化方法》这本教材。 ### 回答2: 《最优化方法》是孙文瑜编写的教材,它是第二版的PDF版本。最优化方法是一门涵盖了数学、计算机科学和工业工程等多学科知识的学科,它通过数学模型和算法的运用来最大程度地提高和改善事物的效率和性能。 这本教材的第二版PDF版本相对于第一版,有着一些更新和改进。它更加详细地介绍了最优化方法的基本原理、经典算法和应用案例。通过这本教材,读者可以系统地学习和了解最优化问题的解决方法,以及其在实际领域中的应用。 在《最优化方法》的第二版中,孙文瑜将优化问题分类,并介绍了各类问题的数学模型和相应的算法。读者可以了解到线性规划、非线性规划、整数规划、动态规划等不同类型的最优化问题的求解方法。此外,该教材还涉及到多目标优化和随机优化等高级话题,使读者能够更全面地理解和应用最优化方法。 通过阅读《最优化方法》这本教材的第二版,读者可以学到许多解决实际问题的技巧和方法。教材中提供了大量的例题和习题,帮助读者加深对知识的理解,并提供了答案和解析供读者参考。此外,教材还提供了一些实际的应用案例,如供应链优化、生产调度等,使读者能够将所学知识应用到实际工作中。 总的来说,孙文瑜的《最优化方法》第二版PDF是一本很有价值的教材,它系统地介绍了最优化问题的基本原理和方法,并提供了大量的例题和案例供读者练习和参考。无论是对于学术研究还是工程实践,该教材都是一本很好的参考资料。 ### 回答3: 《最优化方法》(第二版)是由孙文瑜撰写的一本关于最优化方法的教材。该教材总共分为十个章节,分别介绍了最优化问题、线性规划、非线性规划、动态规划、整数规划、随机规划、参数规划等内容。 在第一章中,孙文瑜首先对最优化问题进行了定义和分类,并介绍了一些常用的数学工具和术语,如向量、矩阵、凸集等。接着,他详细介绍了最优化问题的表达式、约束条件和解的定义,为后续章节的内容打下了基础。 进入第二章,孙文瑜开始介绍线性规划的基本概念和方法。他详细讲解了线性规划问题的形式化表示、标准型、单纯形法和对偶性等内容,并通过一些例子和算法的步骤来说明线性规划的解法过程。 接下来的几个章节分别介绍了非线性规划、动态规划、整数规划、随机规划和参数规划等内容。孙文瑜通过一些实际问题的模型来说明这些方法的应用,并详细讲解了相应的算法和求解技巧。 通过阅读这本教材,读者可以深入了解最优化方法的原理和应用,掌握各种求解技巧和算法。孙文瑜在书中详细介绍了每种方法的基本原理,并通过大量的例子和具体的算法步骤来帮助读者理解和掌握。 总而言之,《最优化方法》(第二版)是一本综合性的教材,内容详尽、逻辑清晰。通过阅读和学习这本教材,读者将能够系统地学习和应用最优化方法,为解决实际问题提供有效的解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王兆威

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值