Python 旋风之旅—Python 的基本语义:变量和对象

本节将开始介绍 Python 语言的基本语义。与上一节介绍的语法相反,语言的语义涉及语句的含义。与讨论语法一样,这里我们将预览 Python 中一些基本的语义解释,以为您提供更好的参考框架,以帮助理解以下各节中的代码。

 

本节将介绍变量和对象的语义,这是在Python脚本中存储、引用和操作数据的主要方式。

 

Python 变量是指针

在 Python 中给变量赋值,容易到只需将变量名放在等号(=)的左侧:

# assign 4 to the variable xx = 4

这看上去很简单,但是如果您对该操作的真正含义理解有误,那么 Python 的工作原理可能会令人困惑。我们将在这里进行简要地探讨。

 

在许多编程语言中,变量被视为将数据放入其中的容器或存储桶。例如在C语言中:

// C codeint x = 4;

 

您实际上是定义一个名为 x 的“内存桶”,并将值 4 放入其中。相反,在Python 中,最好不要将变量视为容器,而应将其视为指针。所以在Python 中,当您编写:

x = 4

您实际上是定义(或者创建)一个名为 x 的指针(即 python 中的变量),该指针指向包含值 4 的存储桶。请注意这里的意义:由于Python 变量能够指向各种对象,因此无需先“声明”该变量,甚至不需要该变量总是指向相同类型的信息(即不需要声明变量的类型)!这就是人们所说的 Python 是动态类型的原因:变量名可以指向任何类型的对象。因此,在Python中,您可以执行以下操作:

#这里 x 第一次出现会首先创建名称为 x 的变量,并指向对象数字 1.x = 1         # x is an integer x = 'hello'   # now x is a stringx = [1, 2, 3] # now x is a list

 

然而静态类型语言的使用者可能会觉得少了像 C 语言中声明变量所附带的类型的安全性,

int x = 4;

 

这种动态类型是使 Python 能如此快速地编写和易于阅读的代码的特征之一。

 

您所需要注意的是这种“变量作为指针”方法的后果。如果我们有两个指向同一个可变对象的变量名,那么更改一个也会同时更改另一个!例如,让我们创建和修改列表:

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

我们创建了两个变量 x 和 y,它们都指向同一对象。因此,如果我们通过两个变量之一来修改列表,我们将看到“其他”列表也将被修改:

print(y)
[1, 2, 3]
x.append(4) # append 4 to the list pointed to by xprint(y) # y's list is modified as well!
[1, 2, 3, 4]

 

如果您错误地将变量视为包含数据的存储容器,则此行为可能会造成理解上的混乱。但是,如果您正确地将变量视为对象的指针,则此行为的意义就很容易理解了。

 

还要注意,如果我们使用 “=” 为 x 赋另一个值,则不会影响 y 的值—赋值只是改变变量指向的对象:

x = 'something else'print(y)  # y is unchanged
[1, 2, 3, 4]

同样,完全可以这样理解,将 x 和 y 视为指针(理解这个需要一点点 C 语言的知识),而将“=”运算符视为改变变量所指向的操作。

您可能在想,这种指针的用法是否会使 Python 中的算术运算难以跟踪,但是 Python 的设计使这不是问题。 数字,字符串和其他简单类型是不可改变的:您不能更改它们的值–您只能更改变量指向的对象。 因此,例如,执行以下操作是绝对安全的:

x = 10
y = x
x += 5  # add 5 to x's value, and assign it to x,执行完这条语句后 x 指向了新的对象15.
print("x =", x)
print("y =", y)
x = 15
y = 10

当我们执行 x += 5 时,我们并没有修改 x 指向的“10”这个对象的值; 而是更改变量 x 的指向,使其指向具有值 15 的新整数对象。因此,y 的值不受此操作的影响。

一切皆对象


Python 是一种面向对象的编程语言,在 Python 中,一切都是对象。

让我们详细说明这意味着什么。 前面我们看到变量可以理解为指针,变量名称本身没有附加任何类型信息。 这导致一些人错误地理解为 Python 是一种无类型的语言。 但是情况并非如此! 考虑以下:

x = 4
type(x)
int
x = 'hello'
type(x)
str
x = 3.14159
type(x)
float

从上面可以看出 Python 是有类型; 只是类型不是链接到变量名的,而是链接到对象本身的(即类型信息是和对象绑定在一起的)。

在像 Python 这种的面向对象的编程语言中,对象是一个实体,其中包含数据以及关联的元数据和/或函数(方法)。 在 Python 中,一切都是对象,这意味着每个实体都有一些元数据(称为属性)和关联的函数(称为方法)。 这些属性和方法通过点语法( dot syntax)访问。

例如,在前面我们看到列表有一个 append 方法,该方法将一个条目添加到列表中,并通过点(“.”)语法进行访问:

L = [1, 2, 3]
L.append(100)
print(L)
[1, 2, 3, 100]

然而你可能预想到诸如列表之类的复合对象具有属性和方法,但出乎意料的是,在Python中,即使简单类型也具有属性和方法。 例如,数值类型具有 real 和 imag 属性,如果将其视为复数,则该属性分别表示实部和虚部:

x = 4.5
print(x.real, "+", x.imag, 'i')
4.5 + 0.0 i

方法与属性类似,不同之处在于方法是可以使用左括号和右括号调用的函数。 例如,浮点数具有一个称为 is_integer 的方法,该方法检查该值是否为整数:

x = 4.5
x.is_integer()
False
x = 4.0
x.is_integer()
True

当我们说 Python 中的所有东西都是对象时,我们实际上是说一切都是对象-甚至对象的属性和方法本身也是具有自身类型信息的对象:

type(x.is_integer)
builtin_function_or_method

我们会发现 Python 的“一切都是对象”设计,这个选择允许了一些非常方便的语言构造。

 

本文来自翻译如下文章,仅用于学习

原文:https://jakevdp.github.io/WhirlwindTourOfPython/03-semantics-variables.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章