Python中的变量

发布于:2021-02-01 14:59:20

0

118

0

基础知识 python 变量

在上一篇关于Python基本数据类型的教程中,您看到了如何创建各种Python数据类型的值。但到目前为止,所有显示的值都是文本值或常量值:

>>> print(5.3)
5.3

如果您正在编写更复杂的代码,那么您的程序将需要随着程序执行的进行而改变的数据。

您将在本教程中学习到:您将学习如何用抽象术语对象来描述Python程序中的每一项数据,以及如何使用名为变量的符号名称来操作对象。

变量赋值

将变量视为附加到特定对象的名称。在Python中,变量不需要像许多其他编程语言那样预先声明或定义。要创建一个变量,只需给它赋值,然后开始使用它。赋值用一个等号(=)完成:

>>> n = 300

这被读取或解释为“n被赋值300”,一旦这样做,n可以用在语句或表达式中,其值将被替换:

>>> print(n)
300

就像文本值可以在REPL会话中直接从解释器提示符显示一样,无需print(),变量也可以:

>>> n
300

稍后,如果您更改n的值并再次使用它,新值将被替换:

>>> n = 1000
>>> print(n)
1000
>>> n
1000

Python还允许链式赋值,这使得可以同时将相同的值赋给多个变量:

>>> a = b = c = 300
>>> print(a, b, c)
300 300 300

上面的链式赋值将300赋给变量abc同时进行。

Python中的变量类型

在许多编程语言中,变量是静态类型的。这意味着变量最初被声明为具有特定的数据类型,并且在其生存期内分配给它的任何值都必须始终具有该类型。

Python中的变量不受此限制。在Python中,可以为变量分配一种类型的值,然后再重新分配另一种类型的值:

>>> var = 23.5
>>> print(var)
23.5

>>> var = "Now I'm a string"
>>> print(var)
Now I'm a string

对象引用

进行变量赋值时实际发生了什么?这是Python中的一个重要问题,因为答案与许多其他编程语言中的答案有些不同。

Python是一种高度面向对象的语言。事实上,Python程序中几乎所有的数据项都是特定类型或类的对象。(这一点将在这些教程中多次重复。)

考虑以下代码:

>>> print(300)
300

当呈现语句时,解释器执行以下操作:

  • 创建整数对象

  • 给它值300

  • 显示它在控制台中

您可以看到使用内置的函数创建了一个整数对象:

>>> type(300)

Python变量是一个符号名,是指向对象的引用或指针。一旦一个对象被指定给一个变量,你就可以用这个名字来引用这个对象。但是数据本身仍然包含在对象中。

例如:

>>> n = 300

此赋值创建一个值为300的整数对象,并指定变量n指向该对象。

可变参考图

下面的代码验证是否n指向整数对象:

>>> print(n)
300
>>> type(n)
<class 'int'>

现在考虑以下语句:

>>> m = n

执行它会发生什么?Python不会创建另一个对象。它只是创建一个新的符号名称或引用m,它指向指向的同一对象n。

Python变量引用同一对象(插图)

接下来,假设您这样做:

>>> m = 400

现在,Python使用value创建一个新的整数对象400,并m成为对其的引用。

对Python中单独对象的引用(图)

最后,假设此语句接下来执行:

>>> n = "foo"

现在,Python使用该值创建一个字符串对象,"foo"并对其进行n引用。

Python变量参考图

不再有对整数对象的引用300。它是孤立的,无法访问它。

本系列中的教程有时会提到对象的生命周期。对象的生命始于创建之时,这时至少创建了对其的一个引用。如上所见,在对象的生存期内,可能会创建对该对象的其他引用,并且对它的引用也会被删除。只要有至少一个引用,一个对象就可以保持原样。

当对一个对象的引用数降至零时,将无法再访问该对象。到那时,它的寿命结束了。Python最终将注意到它不可访问,并回收分配的内存,以便将其用于其他用途。在计算机术语中,此过程称为垃圾收集。

对象标识

在Python中,创建的每个对象都有一个唯一标识它的数字。在生命周期重叠的任何时期,保证没有两个对象具有相同的标识符。一旦一个对象的引用计数降到零并且被垃圾收集,就像上面的300对象一样,那么它的标识号就变为可用,并且可以再次使用。

内置的Python函数id()返回一个对象的整数标识符。使用id()函数,您可以验证两个变量确实指向同一对象:

>>> n = 300
>>> m = n
>>> id(n)
60127840
>>> id(m)
60127840

>>> m = 400
>>> id(m)
60127872

赋值后m = nmn都指向同一对象,由id(m)id(n)返回相同数字的事实确认。一旦m被重新分配到400mn指向具有不同标识的不同对象。

深入:缓存小整数值

根据您现在对Python中变量赋值和对象引用的了解,下面的内容可能不会让您感到惊讶:

>>> m = 300
>>> n = 300
>>> id(m)
60062304
>>> id(n)
60062896

通过语句m = 300,Python创建了一个值为300的整数对象,并将m设置为对它的引用。然后将n类似地分配给值为300的整数对象,但不是相同的对象。因此,它们具有不同的标识,您可以通过id()。

返回的值来验证这些标识,但请考虑以下情况:

>>> m = 30
>>> n = 30
>>> id(m)
1405569120
>>> id(n)
1405569120

这里,mn分别分配给值为30的整数对象。但在这种情况下,id(m)id(n)是相同的!

为了优化,解释器在启动时为[-5, 256]范围内的整数创建对象,然后在程序执行期间重用它们。因此,当您将单独的变量赋给此范围内的整数值时,它们实际上将引用同一对象。

变量名

到目前为止,您看到的示例使用了简短的变量名,如mn。但是变量名可能更冗长。事实上,这样做通常是有益的,因为这样可以使变量的用途乍一看更加明显。

正式地说,Python中的变量名可以是任意长度,可以由大小写字母(A-Za-z)、数字(0-9)和下划线字符(_). 另一个限制是,尽管变量名可以包含数字,但变量名的第一个字符不能是数字。

注意:Python3的一个新增功能是完全支持Unicode,它也允许变量名中使用Unicode字符。在以后的教程中,您将更深入地了解Unicode。

例如,以下所有变量名都是有效的:

>>> name = "Bob"
>>> Age = 54
>>> has_W2 = True
>>> print(name, Age, has_W2)
Bob 54 True

但是这个不是,因为变量名不能以数字开头:

>>> 1099_filed = False
SyntaxError: invalid token

请注意,大小写非常重要。小写字母和大写字母不一样。下划线字符的使用也很重要。以下每一项都定义了一个不同的变量:

>>> age = 1
>>> Age = 2
>>> aGe = 3
>>> AGE = 4
>>> a_g_e = 5
>>> _age = 6
>>> age_ = 7
>>> _AGE_ = 8

>>> print(age, Age, aGe, AGE, a_g_e, _age, age_, _AGE_)
1 2 3 4 5 6 7 8

没有什么可以阻止您在同一个程序中创建两个不同的变量,即ageAge,或者就此而言agE。但这可能是不明智的。当你离开你的代码一段时间后,它很可能会迷惑任何试图阅读你的代码的人,甚至你自己。

给一个变量起一个足够描述性的名字是值得的,这样可以清楚地说明它的用途。例如,假设你正在统计大学毕业的人数。您可以选择以下任一选项:

>>> numberofcollegegraduates = 2500
>>> NUMBEROFCOLLEGEGRADUATES = 2500
>>> numberOfCollegeGraduates = 2500
>>> NumberOfCollegeGraduates = 2500
>>> number_of_college_graduates = 2500

>>> print(numberofcollegegraduates, NUMBEROFCOLLEGEGRADUATES,
... numberOfCollegeGraduates, NumberOfCollegeGraduates,
... number_of_college_graduates)
2500 2500 2500 2500 2500

所有这些选项都可能比nncg等更好。至少你可以从名称中看出变量的值应该代表什么。

另一方面,它们不一定都是同样易读的。与许多事情一样,这是个人喜好的问题,但大多数人会发现前两个例子,字母都挤在一起,更难阅读,尤其是所有大写字母中的那一个。最常用的构造多词变量名的方法是最后三个示例:

  • 驼峰大小写:第二个和随后的单词都大写,以便于查看单词边界。(据推测,有人在某个时候突然想到,散布在变量名中的大写字母有点像驼峰。)

  • 例如:numberOfCollegeGraduates

  • Pascal Case:与camel Case相同,除了第一个单词也是大写的以外。

  • 示例:NumberOfCollegeGraduates

  • 蛇形格:单词之间用下划线隔开。

  • 示例:number_of_college_graduates

程序员们以惊人的热情进行了激烈的辩论,到底哪一个更好。可以为他们所有人提出合理的论据。使用这三个中最吸引你的一个。选择一个并始终如一地使用它。

稍后您将看到,变量并不是唯一可以命名的东西。您还可以命名函数、类、模块等。适用于变量名的规则也适用于标识符,标识符是程序对象名称的更通用术语。

Python代码的样式指南,也称为pep8,包含命名约定,列出了不同对象类型名称的建议标准。pep8包含以下建议:

  • 函数和变量名应使用Snake Case。

  • 类名应使用Pascal Case。(PEP 8将此称为“大写”约定。)

保留字(关键字)

标识符名称还有一个限制。Python语言保留了一小组指定特殊语言功能的关键字。任何对象都不能与保留字同名。

在Python3.6中,有33个保留关键字:

{xunruicms_img_title}

您可以通过输入help("keywords")Python解释器随时查看此列表。保留字区分大小写,必须完全按照所示使用。除,和外False,它们全部为小写字母。

尝试创建与任何保留字同名的变量会导致错误:

>>> for = 3
SyntaxError: invalid syntax

结论

本教程介绍了Python变量的基础知识,包括对象引用和标识以及Python标识符的命名。

您现在已经对Python的某些数据类型有了很好的了解,并且知道如何创建引用这些类型的对象的变量。

接下来,您将看到如何将数据对象组合成涉及各种操作的表达式。