发布于:2021-02-01 14:59:20
0
120
0
在上一篇关于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
赋给变量a
、b
和c
同时进行。
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。
接下来,假设您这样做:
>>> m = 400
现在,Python使用value创建一个新的整数对象400,并m成为对其的引用。
最后,假设此语句接下来执行:
>>> n = "foo"
现在,Python使用该值创建一个字符串对象,"foo"并对其进行n引用。
不再有对整数对象的引用300。它是孤立的,无法访问它。
本系列中的教程有时会提到对象的生命周期。对象的生命始于创建之时,这时至少创建了对其的一个引用。如上所见,在对象的生存期内,可能会创建对该对象的其他引用,并且对它的引用也会被删除。只要有至少一个引用,一个对象就可以保持原样。
当对一个对象的引用数降至零时,将无法再访问该对象。到那时,它的寿命结束了。Python最终将注意到它不可访问,并回收分配的内存,以便将其用于其他用途。在计算机术语中,此过程称为垃圾收集。
对象标识
在Python中,创建的每个对象都有一个唯一标识它的数字。在生命周期重叠的任何时期,保证没有两个对象具有相同的标识符。一旦一个对象的引用计数降到零并且被垃圾收集,就像上面的300
对象一样,那么它的标识号就变为可用,并且可以再次使用。
内置的Python函数id()
返回一个对象的整数标识符。使用id()
函数,您可以验证两个变量确实指向同一对象:
>>> n = 300
>>> m = n
>>> id(n)
60127840
>>> id(m)
60127840
>>> m = 400
>>> id(m)
60127872
赋值后m = n
,m
和n
都指向同一对象,由id(m)
和id(n)
返回相同数字的事实确认。一旦m
被重新分配到400
,m
和n
指向具有不同标识的不同对象。
深入:缓存小整数值
根据您现在对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
这里,m
和n
分别分配给值为30
的整数对象。但在这种情况下,id(m)
和id(n)
是相同的!
为了优化,解释器在启动时为[-5, 256]
范围内的整数创建对象,然后在程序执行期间重用它们。因此,当您将单独的变量赋给此范围内的整数值时,它们实际上将引用同一对象。
变量名
到目前为止,您看到的示例使用了简短的变量名,如 正式地说,Python中的变量名可以是任意长度,可以由大小写字母( 注意:Python3的一个新增功能是完全支持Unicode,它也允许变量名中使用Unicode字符。在以后的教程中,您将更深入地了解Unicode。 例如,以下所有变量名都是有效的: >>> name = "Bob" 但是这个不是,因为变量名不能以数字开头: >>> 1099_filed = False 请注意,大小写非常重要。小写字母和大写字母不一样。下划线字符的使用也很重要。以下每一项都定义了一个不同的变量: >>> age = 1 没有什么可以阻止您在同一个程序中创建两个不同的变量,即 给一个变量起一个足够描述性的名字是值得的,这样可以清楚地说明它的用途。例如,假设你正在统计大学毕业的人数。您可以选择以下任一选项: >>> numberofcollegegraduates = 2500 所有这些选项都可能比 另一方面,它们不一定都是同样易读的。与许多事情一样,这是个人喜好的问题,但大多数人会发现前两个例子,字母都挤在一起,更难阅读,尤其是所有大写字母中的那一个。最常用的构造多词变量名的方法是最后三个示例: 驼峰大小写:第二个和随后的单词都大写,以便于查看单词边界。(据推测,有人在某个时候突然想到,散布在变量名中的大写字母有点像驼峰。) 例如: Pascal Case:与camel Case相同,除了第一个单词也是大写的以外。 示例: 蛇形格:单词之间用下划线隔开。 示例: 程序员们以惊人的热情进行了激烈的辩论,到底哪一个更好。可以为他们所有人提出合理的论据。使用这三个中最吸引你的一个。选择一个并始终如一地使用它。 稍后您将看到,变量并不是唯一可以命名的东西。您还可以命名函数、类、模块等。适用于变量名的规则也适用于标识符,标识符是程序对象名称的更通用术语。 Python代码的样式指南,也称为pep8,包含命名约定,列出了不同对象类型名称的建议标准。pep8包含以下建议: 函数和变量名应使用Snake Case。 类名应使用Pascal Case。(PEP 8将此称为“大写”约定。) 保留字(关键字) 标识符名称还有一个限制。Python语言保留了一小组指定特殊语言功能的关键字。任何对象都不能与保留字同名。 在Python3.6中,有33个保留关键字: 您可以通过输入help("keywords")Python解释器随时查看此列表。保留字区分大小写,必须完全按照所示使用。除,和外False,它们全部为小写字母。 尝试创建与任何保留字同名的变量会导致错误: >>> for = 3 结论 本教程介绍了Python变量的基础知识,包括对象引用和标识以及Python标识符的命名。 您现在已经对Python的某些数据类型有了很好的了解,并且知道如何创建引用这些类型的对象的变量。 接下来,您将看到如何将数据对象组合成涉及各种操作的表达式。m
和n
。但是变量名可能更冗长。事实上,这样做通常是有益的,因为这样可以使变量的用途乍一看更加明显。A-Z
、a-z
)、数字(0-9
)和下划线字符(_
). 另一个限制是,尽管变量名可以包含数字,但变量名的第一个字符不能是数字。
>>> Age = 54
>>> has_W2 = True
>>> print(name, Age, has_W2)
Bob 54 True
SyntaxError: invalid token
>>> 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 8age
和Age
,或者就此而言agE
。但这可能是不明智的。当你离开你的代码一段时间后,它很可能会迷惑任何试图阅读你的代码的人,甚至你自己。
>>> NUMBEROFCOLLEGEGRADUATES = 2500
>>> numberOfCollegeGraduates = 2500
>>> NumberOfCollegeGraduates = 2500
>>> number_of_college_graduates = 2500
>>> print(numberofcollegegraduates, NUMBEROFCOLLEGEGRADUATES,
... numberOfCollegeGraduates, NumberOfCollegeGraduates,
... number_of_college_graduates)
2500 2500 2500 2500 2500n
或ncg
等更好。至少你可以从名称中看出变量的值应该代表什么。numberOfCollegeGraduates
NumberOfCollegeGraduates
number_of_college_graduates
SyntaxError: invalid syntax
作者介绍