已经很久没有更新python编程教程了,因为笔者最近在忙写论文,话说pdf国内有什么免费且好用编辑器吗?欢迎大家在评论区留言推荐
话不多说,进入正题
Python 变量
Python 变量是计算机内存中的一个命名位,用于在代码运行时跟踪某个值。
变量是通过“赋值”等号创建的=
,变量名称在左边,变量应存储的值在右边:
x = 42
在计算机内存中,每个变量就像一个盒子,由变量名称标识。盒子里有一个指向该变量当前值的指针。
稍后在代码中,出现该变量名,例如x
,检索其当前值,在本例中42
为。代码中变量名的使用没有引号或其他内容。变量名x
只是代码中的一个空单词。
尝试检索不存在的变量的值将失败并出现错误(即从未=
分配该变量名)。
变量赋值规则
下面是一个更加复杂的代码示例,以及该代码运行后的内存图片。
x = 10
y = ‘hello’
y = ‘bye’
z = y
这里要注意的事情...
1. 赋值x = 10
只是设置x
指向10
。
2. 赋值y = 'hello'
将设置y
为指向'hello'
。然后该行y = 'bye'
更改y
为指向'bye'
,覆盖第一个指针。赋值变量会覆盖该变量所具有的任何现有指针。每个赋值都像短语“现在指向”——变量现在指向新的东西,任何先前的设置都将被遗忘。
3. 两个变量之间的赋值z = y
,例如,设置z
为指向与相同的内容y
。现在它们都指向相同的值。它不会将一个变量设置为指向另一个变量,尽管代码看起来确实有点像那样。它也不会在变量之间建立永久关系,就像它们现在必须始终相同一样。令人困惑的是,在数学中,书写符号=
确实建立了永久关系。在代码中,z = y
含义非常有限:设置z
为指向y
此刻指向的内容。
每个值都有一个类型
这是与上图相同的图片,但添加了更多细节。
在 Python 中,内存中的每个值都标有其“类型” - 因此我们看到整数10
略有偏差(int)
-int
是 Python 中整数类型的名称。字符串'hello'
标有 ,str
这是字符串类型的名称。
在 Python 运行时,许多操作都依赖于此功能,根据值的类型适当地处理值。请看此处,+
如果给定运算符int
与str
值,则运算符的行为有何不同:
>>> 1 + 2 # int 值
3
>>> 'a' + 'b' # str 值
‘ab’
>>> '3' + '4' # str 看起来像 int
‘34’
内存和垃圾收集器
上例中的字符串'hello'
显示为灰色。在第三行运行后,代码不再需要它 — 没有变量指向它,因此无法使用它。这种不再可访问的内存在计算机代码中称为“垃圾”。 “垃圾收集器”是一种回收垃圾内存(例如'hello'
此处)的系统,因此可以重新使用其内存来保存新值。这是 Python 在后台自动执行的操作。垃圾收集器会稍微减慢代码的运行速度。
许多现代语言都有垃圾收集器来自动回收垃圾内存。少数语言则让程序员自己识别垃圾内存 - 这样做虽然可以提高运行速度,但对程序员来说却是一件苦差事,而且当程序员错误识别垃圾内存时,这会导致大量错误。Python 的设计优先考虑程序员的生产力,因此 Python 包含垃圾收集器是理所当然的。
可变掉期
假设我们有两个变量,我们想“交换”它们的值,这样每个变量都会取另一个变量的值。这是所有程序员都应该知道的一点编码技巧。
a = 42
b = 13
似乎可以从 开始a = b
,但这并不奏效,因为它会覆盖并因此丢失 的原始值a
。经典的 3 行解决方案使用名为“temp”的临时变量在交换期间保存此值,如下所示:
temp = a
a=b
b = temp
从上图开始,你可以追溯这三个分配,得到这个内存结构:
变量名是表面的标签
通常,变量名的选择要反映其所包含的数据。话虽如此,代码中的变量名有一个有趣的特点。
考虑以下计算
>>> x = 6
>>> y = x + x
>>> y
12
使用几个变量,它计算出 6 加倍等于 12。假设它被这样写:
>>>Alice = 6
>>>Bob = Alice + Alice
>>>Bob
12
这完全是相同的计算,只是使用了不同的变量名。计算中重要的是结构——在计算的每个位置使用哪个值,而不是选择的单词。变量名只是任意标签,将计算的不同部分联系在一起。如果我们在整个代码中一致地更改变量名,计算将以相同的方式进行。Python 不会查看变量名并思考这些英文单词的含义。
也就是说,虽然变量名对于 Python 来说毫无意义,但是好的代码会使用有意义的变量名来帮助程序员在编写和编辑代码时保持思路清晰。