变量与内存地址

PythonBeginner
立即练习

介绍

在本教程中,我们将探讨 Python 中的变量、内存地址以及可变(mutable)和不可变(immutable)数据类型的区别:

  • 不可变数据类型:这些数据类型在创建后无法更改。例如 intfloatstrtuplefrozenset
  • 可变数据类型:这些数据类型在创建后可以被修改。例如 listdictset

对于不可变数据类型,任何更改都会导致创建一个新的对象,而可变数据类型则可以在原地修改。理解这一区别在处理内存地址和变量赋值时至关重要。

我们将涵盖变量赋值、可变和不可变数据类型的特性,以及用于比较内存地址的 is 操作符。让我们开始吧!

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 86%。获得了学习者 100% 的好评率。

变量赋值与内存地址

在 Python 中,变量只是对存储值的内存位置的引用。当你将一个值赋给变量时,Python 会创建一个新对象(如果需要),并让变量引用该对象。

首先打开 Python 解释器:

python

让我们看一个例子:

x = 10
y = x

在这个例子中,变量 x 被赋值为 10。当我们将 x 赋值给 y 时,两个变量现在引用的是同一个内存位置。我们可以使用 id() 函数来检查这一点:

print(id(x))  ## 输出:x 的内存地址
print(id(y))  ## 输出:y 的内存地址,应该与 x 相同

is 操作符

在 Python 中,is 操作符用于比较两个对象的内存地址。如果内存地址相同,is 操作符返回 True;否则返回 False。这与 == 操作符不同,后者比较的是对象的值。

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

print(x is y)  ## 输出:True(x 和 y 具有相同的内存地址)
print(x is z)  ## 输出:False(x 和 z 具有不同的内存地址)

比较内存地址

在这一步中,我们将比较具有相同值的变量的内存地址。

请按照以下指示操作:

## 创建两个具有相同值的整数变量 `a` 和 `b`。
a = 10
b = 10
## 创建两个具有相同元素的列表变量 `c` 和 `d`。
c = [1, 2, 3]
d = [1, 2, 3]

## 比较 `a` 和 `b` 以及 `c` 和 `d` 的内存地址。
print(a is b)  ## 输出:True
print(c is d)  ## 输出:False

在上面的例子中,我们创建了两个具有相同值的整数变量 ab

我们还创建了两个具有相同元素的列表变量 cd

当我们比较 ab 的内存地址时,is 操作符返回了 True。这是因为 ab 共享相同的内存地址。

然而,当我们比较 cd 的内存地址时,is 操作符返回了 False。这是因为 cd 具有不同的内存地址。

那么,这意味着什么?

  1. 具有相同值的不可变数据类型可能共享相同的内存地址。
  2. 具有相同值的可变数据类型具有不同的内存地址。

修改可变数据类型

接下来,我们将一起创建并修改一个可变数据类型。

## 创建两个变量 `x` 和 `y`,它们引用同一个列表。
x = [1, 2, 3]
y = x

## 使用变量 `x` 修改列表。
x.append(4)

## 观察变量 `y` 的变化。
print(y)  ## 输出:[1, 2, 3, 4](y 也反映了变化,因为 x 和 y 共享相同的内存地址)

在这个例子中,我们创建了两个变量 xy,它们引用同一个列表。

当我们使用变量 x 修改列表时,这些变化也会反映在变量 y 中。这是因为 xy 共享相同的内存地址。

修改不可变数据类型

最后,让我们一起来修改一个不可变数据类型。

## 创建两个变量 `a` 和 `b`,它们引用同一个字符串。
a = "hello"
b = a

## 使用变量 `a` 修改字符串。
a = a + ", world"

## 观察变量 `b` 的变化。
print(b)  ## 输出:"hello"(b 没有变化,因为在修改字符串时创建了一个新对象)

在这个例子中,我们创建了两个变量 ab,它们引用同一个字符串。

当我们使用变量 a 修改字符串时,这些变化并未反映在变量 b 中。这是因为 ab 具有不同的内存地址。

总结

在这个高级教程中,我们深入探讨了 Python 变量和内存地址。我们讨论了变量赋值、可变和不可变数据类型,以及用于比较内存地址的 is 操作符。我们还通过动手练习实践了这些概念。理解这些高级概念将帮助你成为一名更熟练的 Python 程序员,因为它能让你更深入地了解 Python 如何管理内存以及变量在更深层次上的运作方式。