Python3 - 开始python编程(二)

Python3 - 开始python编程(二)

引用类型,指针和集合类型

在我们关于 Python 的系列文章的第一部分中,我们介绍了变量,常量和类型。今天,我们将介绍引用类型,指针和集合类型!

在 Python 中,这个概念不存在。相反,我们只有引用类型。尽管我想深入研究,但前提条件对于所有面向对象的语言都是通用的,但它是最难理解的概念之一,称为指针。

基础

之前讨论了内存以及它如何以块,字节和位的形式排列。我想在这里对此进行扩展,并为您提供一些有关内存工作方式的直观表示。

我们创建一个字符串,其中包含值Hello

我在上一篇文章中已经知道,内存是具有值的。如果我们可以看一下该内存,可能像这样:

字符串末尾的 \0 这称为“空终止符”。零表示没有任何意义。这是字符串值的存储方式,并在字符串允许使用空格的同时让程序知道字符串何时完成。

数字略有不同。

数字存储为二进制数字。二进制很容易理解,从内存块最右边的 1 开始,然后向左移动,每次将当前值乘以 2。如果您熟悉图形卡或记忆棒,这就是为什么我们会看到 8 位(Atari,NES),16 位(Sega Genesis,SNES),32 位(PlayStation),64 位(Nintendo 64)等。

用二进制表示,如果位置为 0,则表示关闭,是错误的。如果排名为 1,则为开或为 true。 基于此逻辑,我们只需要计算位置为 1 的位置即可。

现在,这是一组 8 位内存,是的,它是一个完整的内存字节。之前我说过字符串中的每个字符为 2 个字节,这意味着我们使用 16 位来存储字符。二进制的 16 位给我们的最大值为 128。但是,当我们谈论位置时,我们总是从 0 开始。因此 16 位给您的范围是”0-127”。如果您想知道如何获取超出此范围的字符,我将带您到ASCII 表,您可以在其中查看自己的值。您甚至还会看到隐藏的字符,例如空终止符`/ 0’,如上所示。

内存将值存储在三个位置:static,stack 和 heap。

可以快速访问静态内存和堆栈内存,但是从堆访问内容的速度很慢(以计算机时间计)。虽然对您来说似乎并不慢,但从堆栈加载可能要花费一毫秒或更短的时间,而从堆加载可能要花费 10 毫秒。在大多数语言中,您都可以选择根据变量的类型在哪里实例化变量。在 Python 中,解释器(基础引擎)查看您的代码,并通过 scope 推断该变量应存储在内存中的位置。

引用类型和指针

引用类型使用指针将值存储在内存中。在我们深入了解如何使用它们之前,我们确实需要介绍一下指针。

如果查看典型的 C 程序,将会发现到处都使用了指针。

当我们使用 char * name ="Bob"; 时,我们使用 * 来创建一个指针。这告诉系统,给我一个address,我可以在内存中存储该值。然后系统说“好,你可以将第 3 栏用作您的值。”然后,在第 3 块中保存“”Bob”`(当然不带引号)。

如果您使用printf(“%x",name);来打印 name 的值,那么您只会看到地址,该地址看起来可能更像0x03。这是该内存块的 hexadecimal(十六进制) 表示形式。如果要使用值”Bob”,则必须使用printf(* name);(两个打印语句均在 C 中)。

在 C 语言中,如果您想在任何地方更改值,可以使用&name,它表示获取该值的地址并对其进行处理。随着值的更改,您可以通过引用* name将其立即用于新值。

在幕后,Python 会查看您的变量,并为您完成所有这些 * 魔术。因此,它使每个程序员的工作更加轻松。因为它可以为您处理所有这些事情,所以您不必担心会造成内存泄漏,但是,仍然需要担心一些称为竞争条件的问题,我们在后面将介绍。

之所以提出引用类型,是因为我们将在本系列的下一部分中介绍更高级的类型。我只想让您在开始使用之前熟悉引用类型的工作方式。

我记得引用类型的方法是想象一个宝藏。它不属于任何人,但是一旦找到它,我就会写下它的位置,以便我随时可以返回它。如果我想看地图看看它在哪里或告诉别人,我可以使用。如果要打开它并查看里面的宝藏,请使用*。如果要在其中放入东西或取出东西,我仍然必须先使用*才能到达它。

将”Bob”之类的值存储在 C 指针中时,实际上是将每个字母放在单独的内存中。您只知道`B’在哪里;空终止符”\0”告诉计算机何时停止通过内存块进行迭代并返回其具有的任何值。

引用类型可以存储在堆栈中或堆中。如果程序员使用malloc为其手动分配了内存,您就会知道引用类型是否存储在堆中。使用 malloc 创建的任何变量在程序结束时都不会自行消失,您必须根据语言来调用 deallocfree 从内存中删除该值,否则它将保留在内存中直到计算机重新启动。这就是所谓的“内存泄漏”。

Python 为您处理了所有这一切,因此您不必担心mallocdeallocfree。有一个例外,您可以使用del清除内存中存储变量,但是通常不需要使用它。

集合类型

集合类型是包含项目集合的类型。主要有两种类型:listsdictionaries。某些语言将列表称为 array

列表-列表包含有序的元素,通过它们的索引可以访问对应元素的值。

索引由列表开头的项数定义。如果我们这样定义一个列表:

1
my_list = ['鸡蛋','牛奶','黄油','奶酪']

可以通过使用 my_list[0] 来检索每个值,这将为我们提供鸡蛋值,因为它从列表开始处为 0。使用这种逻辑,如果我们想要“黄油”,我们将使用my_list[2],因为它与“鸡蛋”相距”2”个位。      如果我们想更改存储在列表中的值,可以使用

1
my_list [2] ='糖'

在 C 字符串中,当我们在 C 风格字符串中存储”Bob”时,我们实际上创建了一个字符的数组。如果我们说name[0],它将只返回”B”,因为从数组开始到内存为 0。

对于 Python,可以使用以下切片语法:

my_list[1:3]将返回列表中的第二项和第三项。

您还可以通过以下示例使用开放式范围:

my_list[:2]会返回列表中从开始到第二项的所有内容,my_list[1:]从第二个元素开始一直到结尾。

基本语法规则是:     my_list [<开始位置>:<停止位置-1>]

还可以使用负数来排除最后的值。my_list[:-2]返回除列表的最后两个元素以外的所有内容。

列表可以包含任何类型的变量,因此[True,'three',3](即布尔值,字符串和数字)仍然是有效列表。

字典

字典与数组相似,因为它们包含通用类型的值,但是它们是无序的,因此有所不同。它们确实包含索引,但是索引通常是字符串值。考虑到这一点,您可能正在考虑字典中的单词,然后是其定义。这就是它的工作原理!您可以使用以下方法定义字典:

1
my_dictionary = {"Kevin":"Lead Minion","Bob","Determined Minion","Stewart":"Rocker Minion"}

我们可以通过以下方式获得其中任何一个的价值:my_dictionary["Kevin"]      可以使用与列表相同的语法在字典中设置值,而只需使用 key 设置 value。Python 不在乎值的类型是否相同,例如:

1
    my_dictionary["Bob"] ="鲍勃王"

还允许使用my_dictionary["Bob"] = 2      您可以使用声明和实例化字典     my_dictionary = {}

字典和列表在 Python 中广泛使用。您需要小心使用列表,以使其位于其元素的范围内。如果您尝试访问字典中不存在的值,则会收到”KeyValue”错误, 可参考测试 dictionary 字典中是否存在某个 key

Rating: