【Python学习手册(第四版)】学习笔记09.3-Python对象类型-分类、引用VS拷贝VS深拷贝、比较、相等、真假值等详解

news2024/9/9 6:16:51

个人总结难免疏漏,请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。

这部分稍杂,视需要选择目录读取。

主要讲的是对之前的所有对象类型作复习,以通俗易懂、由浅入深的方式进行介绍,所有对象类型共有的特性(例如,共享引用),引用、拷贝、深拷贝,以及比较、相等、真假值等,讨论对象类型领域内常见的错误(“陷阱”)。


目录

对象类型分类

对象灵活性

引用VS拷贝VS深拷贝

重点推荐阅读:

比较、相等性和真值

字典比较

Python中真和假的含义

None对象

bool类型

Python的类型层次

Type对象

Python中的其他类型

循环数据结构


对象类型分类

看过了前面的学习笔记,现在来对他们做一下总结,加以分类。再看一看它们所共有的一些属性。

下面是需要记住的一些要点:

  • ·对象根据分类来共享操作;例如,字符串、列表和元组都共享诸如合并、长度和索引等序列操作。
  • ·只有可变对象(列表、字典和集合)可以原处修改;我们不能原处修改数字、字符串或元组。
  • ·文件导出唯一的方法,因此可变性并不真的适用于它们——当处理文件的时候,它们的状态可能会修改,但是,这与Python的核心类型可变性限制不完全相同。
  • ·表9-3中的“数字”包含了所有数字类型:整数、浮点数、复数、小数和分数。
  • ·表9-3中的字符串包括str,bytes;bytearray字符串类型是可变的。
  • ·集合类似于一个无值的字典的键,但是,它们不能映射为值,并且没有顺序;因此,集合不是一个映射类型或者一个序列类型,frozenset是集合的一个不可变的版本。
  • ·除了类型分类操作,表9-3中所有类型都有可调用的方法,这些方法通常特定于它们的类型。

对象灵活性

一般来说:

  • 列表、字典和元组可以包含任何种类的对象。
  • 列表、字典和元组可以任意嵌套。
  • 列表和字典可以动态地扩大和缩小。

Python的复合对象类型支持任意结构,例如,字典的值可以是列表,这一列表可能包含了元组,而元组可能包含了字典,依此类推。只要能够满足创建待处理数据的模型的需要,嵌套多少层都是可以的。

来看一个嵌套的例子。

下面的交互式会话定义了一个嵌套复合序列对象的树,如图所示。

>>> l = ['abc', [(1,2),([3], 4)], 5]
>>> l[1]
[(1, 2), ([3], 4)]

要存取它的内容时,我们需要按要求串起多个索引操作。Python从左到右计算这些索引,每一步取出一个更深层嵌套对象的引用。下图描述了一般情况下,用于存取嵌套对象的语法。也许是过于复杂且莫名其妙的数据结构。

>>> l[1][1]
([3], 4)
>>> l[1][1][0]
[3]
>>> l[1][1][0][0]
3
>>>

引用VS拷贝VS深拷贝

赋值操作总是储存对象的引用,而不是这些对象的拷贝。在实际应用中,这往往就是你想要的。

不过,因为赋值操作会产生相同对象的多个引用,需要意识到在原处修改可变对象时可能会影响程序中其他地方对相同对象的其他引用。

如果不想这样做,就需要明确地告诉Python复制该对象。

当较大的对象参与时,就会变得更为严重。

例如,下面这个例子生成一个列表并赋值为X,另一个列表赋值为L,L嵌套对列表X的引用。这一例子中还生成了一个字典D,含有另一个对列表X的引用。

>>> x = [1,2,3]
>>> l = ['a',x,'b']
>>> d = {'x':x ,'y':2}

对我们先前生成的列表有三个引用:来自名字X、来自赋值为L的列表内部以及来自赋值为D的字典内部。

共享对象引用:因为变量X引用的列表也在被L和D引用的对象内引用,修改X的共享列表与L和D的看起来也有所不同。

由于列表是可变的,修改这三个引用中任意一个共享列表对象,也会改变另外两个引用的对象。

>>> x[1] = 'life'
>>> l
['a', [1, 'life', 3], 'b']
>>> d
{'x': [1, 'life', 3], 'y': 2}

引用是其他语言中指针的更高级模拟。在不止一个地方储存相同的引用(变量、列表等)是可能的。你可以在程序范围内任何地方传递大型对象而不必在途中产生拷贝。然而,如果你的确需要拷贝,那么可以明确要求。

  • ·没有限制条件的分片表达式(L[:])能够复制序列。
  • ·字典copy方法(X.copy())能够复制字典。
  • ·有些内置函数(例如,list)能够生成拷贝(list(L))。
  • ·copy标准库模块能够生成完整拷贝。

举个例子,假如有一个列表和一个字典,你又不想凭借其他变量来修改它们的值。

>>> l = [1,2,3]
>>> d = {'a':1,'b':2}

可以简单地把拷贝赋值为其他变量,而不是相同对象的引用。

>>> a = l[:]
>>> b = d.copy()

>>> a[1] = 'hi'
>>> b['c'] = 3

>>> l,d
([1, 2, 3], {'a': 1, 'b': 2})

>>> a,b
([1, 'hi', 3], {'a': 1, 'b': 2, 'c': 3})

就原始的例子而言,可以通过对原始列表进行分片而不是简单的命名操作来避免引用的副作用。

>>> x = [1,2,3]

>>> l = ['a', x[:],'b']
>>> d = {'x':x[:] ,'y':2}

L和D现在会指向不同的列表而不再是X。结果就是,凭借X所做的修改只能够影响X而不会再影响L和D。类似地,修改L或D不会影响X。

重点推荐阅读:

拷贝需要注意的是:无条件值的分片以及字典copy方法只能做顶层复制。也就是--不能够复制嵌套的数据结构(如果有的话)。

本书中这里没有举例,所以不太容易理解。于是我翻看其他好多深拷贝、浅拷贝等的文章,都讲的很好,很细。但是很难理解。于是我自己举个例子吧

>>> l
['a', [1, 2, 3, (1, 2), [3, [2, 1], 2]], 'b']

>>> l1 = l[:]
>>> l1.append('ss')
>>> l1
['a', [1, 2, 3, (1, 2), [3, [2, 1], 2]], 'b', 'ss']

>>> l1[1].append('s')
>>> l1
['a', [1, 2, 3, (1, 2), [3, [2, 1], 2], 's'], 'b', 'ss']
>>> l
['a', [1, 2, 3, (1, 2), [3, [2, 1], 2], 's'], 'b']

>>> l[1].append('sd')
>>> l
['a', [1, 2, 3, (1, 2), [3, [2, 1], 2], 's', 'sd'], 'b']
>>> l1
['a', [1, 2, 3, (1, 2), [3, [2, 1], 2], 's', 'sd'], 'b', 'ss']

按上面的例子,l列表复制了一份成为l1,l中嵌套了一层列表。因为之前的例子并没有对嵌套里的内容做新增、修改、删除等,这里l1嵌套的列表里新增了一个一个字符串。l1 l也都新增了。

是不是l1的问题?换l新增,看到l l1嵌套的列表也都新增了。

再对比l1.append('ss'),l却没有,说明无条件值的分片以及字典copy方法只能做顶层复制。

那么修改、删除会不会也会改变非顶层呢? 会的

>>> l
['a', [99, 2, 3, (1, 2), [3, [2, 1], 2], 's', 'sd'], 'b']
>>> l1
['a', [99, 2, 3, (1, 2), [3, [2, 1], 2], 's', 'sd'], 'b', 'ss']


>>> l[1].pop()
'sd'
>>> l
['a', [99, 2, 3, (1, 2), [3, [2, 1], 2], 's'], 'b']
>>> l1
['a', [99, 2, 3, (1, 2), [3, [2, 1], 2], 's'], 'b', 'ss']

>>> del l[1][-1]
>>> l
['a', [99, 2, 3, (1, 2), [3, [2, 1], 2]], 'b']
>>> l1
['a', [99, 2, 3, (1, 2), [3, [2, 1], 2]], 'b', 'ss']
>>>

如果需要一个深层嵌套的数据结构的完整的、完全独立的拷贝要用copy.deepcopy()。

使用标准的copy模块——import copy语句,并编辑X=copy.deepcopy(Y)对任意嵌套对象Y做完整的复制。这一调用语句能够递归地遍历对象来复制它们所有的组成部分。

>>> import copy
>>> x = copy.deepcopy(l)
>>> l
['a', [1, 2, 3, (1, 2), [3, [2, 1], 2], 's', 'sd'], 'b']
>>> x
['a', [1, 2, 3, (1, 2), [3, [2, 1], 2], 's', 'sd'], 'b']
>>> x[1].append('aa')
>>> x
['a', [1, 2, 3, (1, 2), [3, [2, 1], 2], 's', 'sd', 'aa'], 'b']
>>> l
['a', [1, 2, 3, (1, 2), [3, [2, 1], 2], 's', 'sd'], 'b']

注意分片和copy方法以及deepcopy的使用注意。


比较、相等性和真值

一般来说,Python中不同的类型的比较方法如下:

  • ·数字通过相对大小进行比较。
  • ·字符串是按照字典顺序,一个字符接一个字符地对比进行比较("abc"<"ac")。
  • ·列表和元组从左到右对每部分的内容进行比较。
  • 字典的相对大小比较在Python 3.0后不支持
  • ·数字混合类型比较(例如,1<'spam')在Python 3.0后是错误的。

结构化对象的比较就好像是你把对象写成文字,并从左到右一次一个地比较所有部分。

所有的Python对象也可以支持比较操作——测试相等性、相对大小等。Python的比较总是检查复合对象的所有部分,直到可以得出结果为止。

当嵌套对象存在时,Python能够自动遍历数据结构,并从左到右递归地应用比较,要多深就走多深。过程中首次发现的差值将决定比较的结果。

例如,在比较列表对象时将自动比较它的所有内容。

>>> l1 = [1,('a',3)]
>>> l2 = [1,('a',3)]
>>> l1 == l2 ,l1 is l2
(True, False)

在这里L1和L2被赋值为列表,虽然相等,却是不同的对象。

如果l1 l2换成同样的短字符串,那么都是true。因为在Python内部暂时储存并重复使用短字符串作为最佳化,事实上内存里只有一个字符串'life'供S1和S2分享。

>>> s1 = 'life'
>>> s2 = 'life'
>>> s1 == s2, s1 is s2
(True, True)

那么更长的呢?

>>> s1 = 'a longer string'
>>> s2 = 'a longer string'
>>> s1 == s2, s1 is s2
(True, False)

当然,由于字符串是不可变的,对象缓存机制和程序代码无关——无论有多少变量与它们有关,字符串是无法在原处修改的。

“==”几乎是所有等值检验时都会用到的操作符;而is则保留了极为特殊的角色。

相对大小的比较也能够递归地应用于嵌套的数据结构。

>>> l1 = [1,('a',3)]
>>> l2 = [1,('a',2)]
>>> l1 == l2 , l1 < l2 , l1 > l2
(False, False, True)

嵌套的3大于2,这里的L1大于L2。

字典比较

在Python 3.0后,字典的大小比较删除了,因为当期望相等的时候,它们导致太多的负担。

替代方法,要么编写循环来根据键比较值,要么手动比较排序的键/值列表——items字典方法的和内置的sorted足够了:

>>> d1 = {'a':1,'b':2}
>>> d2 = {'a':1,'b':3}
>>> d1 == d2
False
>>> d1 < d2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'dict' and 'dict'

>>> list(d1.items())
[('a', 1), ('b', 2)]
>>> sorted(d1.items())
[('a', 1), ('b', 2)]
>>> sorted(d1.items()) < sorted(d2.items())
True
>>> sorted(d1.items()) > sorted(d2.items())
False

Python中真和假的含义

在Python中,与大多数程序设计语言一样,整数0代表假,整数1代表真。不过,除此之外,Python也把任意的空数据结构视为假,把任何非空数据结构视为真。

真和假的概念是Python中每个对象的固有属性:每个对象不是真就是假,如下所示:

·数字如果非零,则为真。

·其他对象如果非空,则为真。

作为一个应用,判断对象自身是真或假,通常会看到Python程序员像if X:这样编写测试,其中,假设X是一个字符串,那么,等同于if X !='':。

None对象

Python还有一个特殊对象:None(表9-4中最后一项),总被认为是假。

这是Python中一种特殊数据类型的唯一值,一般都起到一个空的占位作用,与C语言中的NULL指针类似。

对于列表来说,你是无法为偏移赋值的,除非这个偏移是已经存在的。

要预先分配一个100项的列表,这样你可以在100个偏移的任何一个加上None对象:

>>> l = [None] * 100
>>> l
[None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None]

这不会限制列表的大小(它随后仍然可以增长或缩短),但是直接预先设置一个初始大小,会考虑到将来的索引赋值。

当然,可以以同样的方式用0来初始化一个列表,但最佳的实践是如果还不知道列表的内容的话使用None。

None不是意味着“未定义”。None是某些内容,而不是没有内容(尽管起名字是没有内容)——它是一个真正的对象,并且有一块内存,由Python给定一个内置的名称。

bool类型

Python的布尔类型bool不过是扩展了Python中真、假的概念。True和False这些只是整数1和0的定制版本而已。

由于这个新的类型的运行方式,这的确只是先前所说的真、假概念的较小扩展而已,这样的设计就是为了让真值更为明确。

  • ·当明确地用在真值测试时,True和False这些文字就变成了1和0,但它们使得程序员的意图更明确。
  • ·交互模式下运行的布尔测试的结果打印成True和False的字样,而不是1和0,以使得程序的结果更明确。

像if这样的逻辑语句中,没必要只用布尔类型。所有对象本质上依然是真或假,即使使用其他类型,提到的所有布尔概念依然是可用的。

Python还提供了一个内置函数bool,它可以用来测试一个对象的布尔值:

>>> bool(3)
True
>>> bool('a')
True
>>> bool({})
False
>>> bool(())
False

实际上,很少真正注意到逻辑测试所产生的布尔类型,因为if语句和其他的选择工具自动地使用布尔结果。

Python的类型层次

图9-3总结了Python允许的所有内置对象类型以及它们之间的关系。我们已经讨论了它们当中最主要的,图9-3中多数其他对象种类都相当于程序单位(例如,函数和模块),或者说明了解释器的内容(例如,堆栈和编译码)。

按类别组织的Python的主要内置对象类型。Python中所有一切都是某种类型的对象,即便是某个对象的类型!任何对象的类型都是类型为"type"的对象。

Python系统中的任何东西都是对象类型,而且可以由Python程序来处理。例如,可以传递一个类给函数,赋值为一个变量,放入一个列表或是字典中等。

Type对象

即使是类型本身在Python中也是对象类型。

内置函数type(X)能够返回对象X的类型对象。类型对象可以用在Python中的if语句来进行手动类型比较。

Python 3.0中的类型标准库模块同样提供其他不能作为内置类型使用类型的名称。而且用isinstance函数进行类型测试也是有可能的。例如,下列所有类型测试都为真:

>>> type([1]) == type([])
True
>>> type([1]) == list
True
>>> isinstance([1],list)
True

>>> import types
>>> def f():pass
...
>>> type(f) == types.FunctionType
True

因为目前Python的类型也可以再分为子类,一般都建议使用isinstance技术。


Python中的其他类型

在后面将要遇到的函数、模块和类,典型Python的安装还有几十种其他可用的对象类型,允许作为C语言的扩展程序或是Python的类:正则表达式对象、DBM文件、GUI组件、网络套接字等。

这些附带工具和我们至今所见到的内置类型之间的主要区别在于,内置类型有针对它们的对象的特殊语言生成语法(例如,4用于整数,[1,2]用于列表,open函数用于文件)。

在内置模块中输入的其他工具必须先导入才可以使用。例如,为了生成一个正则表达式对象,你需要输入re并调用re.compile()。参考Python的库手册。

循环数据结构

如果遇到一个复合对象包含指向自身的引用,就称之为循环对象。

无论何时Python在对象中检测到循环,都会打印成[...],而不会陷入无限循环。

>>> l = ['life']
>>> l.append(l)
>>> l
['life', [...]]

除了要了解方括号括起来的三个点代表对象中带有循环之外,有一种情况也应该知道,因为它会造成误区——如果不小心,循环结构可能导致程序代码陷入无法预期的循环当中。

例如,有些程序中保留了已经被访问过的列表或者字典,并通过检测来确定他们是否在循环当中。

除非你真的需要,否则不要使用循环引用。虽然有很多创建循环的不错的理由,但除非你知道代码会如何处理,否则你可能不想让对象在实际中频繁地引用自身。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1962368.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

『康之泉活水馆』手游:打造夏日梦幻水世界

设计背景 夏日的热浪与城市的喧嚣困扰着忙碌奔波的人群&#xff0c;康之泉活水馆&#xff0c;作为多功能的室内水上乐园&#xff0c;以其独特的魅力&#xff0c;成为夏日避暑的理想之地&#xff0c;让身心得以彻底放松。 设计理念 优联前端以康之泉品牌IP形象“康康”为灵感&a…

[GYCTF2020]FlaskApp (pin码,jinja2绕过注入)

题目就是flask 下面是判断模版注入的方法 a{*comment*}b和{{7*7}}base64编码后解码都报错no&#xff0c;无法判断模版引擎 直接用下jinja2的试一试&#xff0c;把编码后的密文拿去解码&#xff0c;payload&#xff1a; {{"".__class__mro(2)__subclasses__()}} 报…

英文文献翻译方法哪个好?高效率的翻译方法分享

三伏天的酷热也抵挡不住学术人探索知识的脚步&#xff0c;阅读和翻译英文文献几乎已经成为了许多研究者和学者的日常。然而在面对浩如烟海的英文资料时&#xff0c;如何高效准确地进行翻译&#xff0c;成为了亟待解决的问题。 今天我便挖掘到了5款实用的英文文献翻译工具&…

4.1.1、操作系统的概述

操作系统的作用:通过资源管理提高计算机系统的效率;改善人机界面向用户提供友好的工作环境。 操作系统的特征:并发性、共享性、虚拟性、不确定性。 操作系统的功能:进程管理、存储管理、文件管理、设备管理、作业管理。 操作系统的分类:批处理操作系统、分时操作系统(轮流使…

美股:苹果选择谷歌芯片支持人工智能技术

最近的研究报告显示&#xff0c;苹果公司在其新一代人工智能工具和功能套件中选择依赖谷歌设计的芯片&#xff0c;而非市场领导者 Nvidia。这一决定引发了业界的关注&#xff0c;尤其是考虑到Nvidia在人工智能处理器市场的主导地位。 谷歌云的TPU在苹果的AI基础设施中发挥关键作…

计算机再过几年会没落?

大部分人卷的计算机&#xff1a;Java web 实际上的计算机&#xff1a;web&#xff0c;图形学&#xff0c;Linux系统开发&#xff0c;一系列嵌入式开发&#xff0c;数据库&#xff0c;高性能服务器&#xff0c;中间件开发&#xff0c;三维建模&#xff0c;网络安全&#xff0c;…

vue2 封装弹框组件

安装 element-ui npm install element-ui --save ---force main.js 导入 import Vue from vue; import ElementUI from element-ui; import element-ui/lib/theme-chalk/index.css; import App from ./App.vue; Vue.use(ElementUI); new Vue({ el: #app, render: h > h(Ap…

Minio、MySQL、Redis、Milvus 安装

CPU&#xff1a;2核↑&#xff0c;内存&#xff1a;4GB↑ 开发工具&#xff1a;eclipse-jee、MySQL Workbench、MobaXterm、Redis Insight... 操作系统&#xff1a;CentOS Stream 9&#xff08;生产环境&#xff09;、Windos 11 Ubuntu 22.04.3&#xff08;开发环境&#xf…

使用 Kibana 和 Vega 构建高级可视化

作者&#xff1a;来自 Carly Richmond 为了解释在 Kibana 中构建 Vega 可视化的基础知识&#xff0c;我将使用此 GitHub 存储库中的 2 个示例。具体来说&#xff0c;我将介绍&#xff1a; 使用 Elasticsearch 聚合进行数据采购轴和标记事件和信号&#xff08;例如工具提示和更…

工具使用备忘录

npm npm是node包管理工具。yarn是npm的替代品&#xff0c;看起来使用更加广泛。cnpm是中国镜像。 cnpm安装时&#xff0c;曾经出现过错误。不进行安全验证后运行成功。 目前在WSL上可以全局使用cnpm 当时解决的方案是将报错信息copy下来&#xff0c;直接看通义千问的结果。 …

时间序列中多维度、多变量、多元、多尺度

目录 多尺度 多维度 多变量 多元 区别 举例&#xff1a; 多尺度 多尺度时间序列分析是指在不同的时间尺度上对数据进行分析。例如&#xff0c;某些现象可能在短期内表现出一种模式&#xff0c;而在长期内表现出另一种模式。多尺度分析可以帮助我们捕捉这些不同时间尺度上…

北斗RTK高精度定位系统介绍

北斗RTK高精度定位系统是一种高精度、高可靠、高效率的定位系统。它采用北斗卫星导航系统&#xff0c;结合实时动态差分RTK技术&#xff0c;能够实现亚米级的定位准确度&#xff0c;适用于石油化工、工厂、工地、园区、环卫等领域。 北斗RTK的核心技术是RTK技术&#xff0c;即实…

C++ | string

前言 本篇博客讲解c中的string类的使用(常用接口) &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;C_普通young man的博客-CSDN博客 ⏩ 本人giee:普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见&#x1f4dd; &#x1f389…

在 Elasticsearch 中实现采集自动扩展

作者&#xff1a;来自 Elastic Pooya Salehi, Henning Andersen, Francisco Fernndez Castao 正确调整 Elasticsearch 集群的大小并不容易。集群的最佳大小取决于集群正在经历的工作负载&#xff0c;而工作负载可能会随着时间的推移而变化。自动扩展会自动调整集群大小以适应工…

【JavaScript】详解JavaScript语法

文章目录 一、变量和数据类型二、运算符三、条件语句四、循环语句五、函数六、对象和数组七、ES6新特性八、实际应用案例 JavaScript是一门广泛应用于Web开发的编程语言。掌握JavaScript语法是成为前端开发者的第一步。本文将详细介绍JavaScript的基本语法&#xff0c;包括变量…

“Assistants“ has no attribute “files“ in openAI assistants

题意&#xff1a;在 OpenAI 的助手&#xff08;assistants&#xff09;中&#xff0c;“Assistants” 没有 “files” 这个属性。 问题背景&#xff1a; assistant_file client.beta.assistants.files.create(assistant_id st.session_state.assistant_id,file_id st.sessi…

2024年最佳骨传导耳机推荐:五款不容错过的选择!

作为音乐爱好者的我&#xff0c;也一直在寻找一款好的骨传导耳机&#xff0c;听音乐对我来说不仅仅是一种消遣方式&#xff0c;更多是一种对生活、工作上压力和困难的舒缓&#xff0c;所以今天给大家推荐几款骨传导耳机。今天推荐这几款骨传导耳机都是比较有性价比&#xff0c;…

Oracle VM VirtualBox 异常退出,如何解决??

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

向量数据库性能测试工具(VectorDBBench.com)性价比排名

排名 向量数据库(不同硬件配置) 价格/性能比 QP$(每百万次查询所花费的价格)中型数据集, OpenAI 无标量过滤 QP$(每百万次查询所花费的价格)中型数据集, OpenAI 低标量过滤 QP$(每百万次查询所花费的价格)中型数据集, OpenAI 高标量过滤 QP$(每百万次查询所花费的价…

Linux系统之ftp服务配置

&#xff08;1&#xff09;查看vsftpd服务软件是否安装。 若缺少相关软件请使用yum方式安装相关软件。 &#xff08;2&#xff09;关闭防火墙和selinux保护。 &#xff08;3&#xff09;设置匿名访问。 vim /etc/vsftpd/vsftpd.conf 并通过ftp的方式在共享文件夹中创建名为“…