介绍
在本实验中,我们将介绍 Python 赋值和引用的基础知识。我们将探讨 Python 如何处理赋值、如何创建引用,以及如何处理可变(mutable)和不可变(immutable)对象。
在本实验中,我们将介绍 Python 赋值和引用的基础知识。我们将探讨 Python 如何处理赋值、如何创建引用,以及如何处理可变(mutable)和不可变(immutable)对象。
在 Python 中,赋值是将一个名称绑定到一个对象的过程。赋值语句的一般形式如下:
variable = expression
右侧的表达式会被求值,其结果会被赋值给左侧的变量。
让我们来看一个简单的例子:
打开终端并在终端中输入以下命令。
python3
然后,输入以下代码。
## 将值 42 赋值给变量 'x' 并打印它。
x = 42
print(x)
输出:
42
在这里,我们使用 =
运算符将 x
赋值为 42
。然后,我们打印 x
的值。
在 Python 中,变量是对对象的引用。当你将一个值赋值给变量时,实际上是在创建一个指向表示该值的对象的引用。
以下是一个示例来说明这一概念:
## 演示 Python 引用。
x = [1, 2, 3]
y = x
y.append(4)
print("x:", x)
print("y:", y)
输出:
x: [1, 2, 3, 4]
y: [1, 2, 3, 4]
在这个例子中,x
和 y
都引用了同一个列表对象。当我们通过 y
引用修改列表,添加 4
时,这一变化会同时反映在 x
和 y
中。
Python 中有两种类型的对象:可变对象(mutable)和不可变对象(immutable)。
可变对象在创建后可以被修改。列表(list)、字典(dictionary)和集合(set)是可变对象的例子。
不可变对象在创建后不能被修改。整数(integer)、浮点数(float)、字符串(string)和元组(tuple)是不可变对象的例子。
让我们看一个示例,展示可变对象和不可变对象的区别:
## 可变对象示例
mutable_list = [1, 2, 3]
another_mutable_list = mutable_list
another_mutable_list.append(4)
print("mutable_list:", mutable_list)
输出:
mutable_list: [1, 2, 3, 4]
mutable_list
在列表末尾添加了一个 4
,因为它是可变对象,但不可变对象在创建后不能被修改。
## 不可变对象示例
immutable_string = "hello"
another_immutable_string = immutable_string
another_immutable_string = another_immutable_string.upper()
print("immutable_string:", immutable_string)
输出:
immutable_string: hello
它没有任何变化,如果我们尝试像下面这样修改 immutable_string
,Python 会抛出一个 TypeError:
immutable_string[0] = '1'
输出:
TypeError: 'str' object does not support item assignment
让我们再看几个示例,以巩固我们学到的概念:
避免在函数中使用可变对象作为默认参数:
def bad_append(new_item, a_list=[]):
a_list.append(new_item)
return a_list
print(bad_append('one'))
输出:
['one']
看起来没问题,但如果我们再次调用这个函数:
print(bad_append('two'))
输出:
['one', 'two']
这里的问题是,a_list
的默认值在函数定义时被评估。因此,每次调用函数时,你都会得到相同的默认值。正确的方法是在运行时创建它,即在函数内部创建。
def append_to_list(item: int, a_list: list = None) -> list:
"""将项目添加到列表中并返回更新后的列表。"""
if a_list is None:
a_list = []
a_list.append(item)
return a_list
list_a = append_to_list(1, [1, 2, 3])
print(list_a)
输出:
[1, 2, 3, 1]
当你需要处理可变对象的副本时,使用 copy
模块创建一个新对象:
import copy
## 演示 copy 模块的使用。
original_list = [1, 2, 3]
copied_list = copy.copy(original_list)
copied_list.append(4)
print("original_list:", original_list)
print("copied_list:", copied_list)
输出:
original_list: [1, 2, 3]
copied_list: [1, 2, 3, 4]
在这个例子中,copied_list
是 original_list
的一个新副本。当我们向 copied_list
添加 4
时,original_list
保持不变。
对于嵌套的可变对象,使用 copy
函数不起作用:
## 你的复制示例
original_nested_list = [[1, 2], [3, 4]]
copied_nested_list = copy.copy(original_nested_list)
copied_nested_list[0].append(5)
print("original_nested_list:", original_nested_list)
print("copied_nested_list:", copied_nested_list)
输出:
original_nested_list: [[1, 2, 5], [3, 4]]
copied_nested_list: [[1, 2, 5], [3, 4]]
我们可以看到,当我们向 copied_nested_list
添加 5
时,original_nested_list
也会添加 5
。因此,你应该使用 deepcopy
函数。
## 你的深拷贝示例
original_nested_list = [[1, 2], [3, 4]]
deep_copied_list = copy.deepcopy(original_nested_list)
deep_copied_list[0].append(5)
print("original_nested_list:", original_nested_list)
print("deep_copied_list:", deep_copied_list)
输出:
original_nested_list: [[1, 2], [3, 4]]
deep_copied_list: [[1, 2, 5], [3, 4]]
在这个例子中,deepcopy
函数递归地复制了 original_nested_list
,而 copy
函数创建了对 original_nested_list
第一层数据的引用对象。
在本 Python 编程教程中,我们介绍了 Python 赋值和引用的基础知识。我们探讨了 Python 如何处理赋值、如何创建引用,以及如何处理可变和不可变对象。通过理解这些概念,你将能够更好地编写高效且正确的 Python 代码。