Python 赋值与引用

PythonPythonBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

在本实验中,我们将介绍 Python 赋值和引用的基础知识。我们将探讨 Python 如何处理赋值、如何创建引用,以及如何处理可变(mutable)和不可变(immutable)对象。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/BasicConceptsGroup(["Basic Concepts"]) python(("Python")) -.-> python/DataStructuresGroup(["Data Structures"]) python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python(("Python")) -.-> python/PythonStandardLibraryGroup(["Python Standard Library"]) python/BasicConceptsGroup -.-> python/variables_data_types("Variables and Data Types") python/BasicConceptsGroup -.-> python/numeric_types("Numeric Types") python/BasicConceptsGroup -.-> python/strings("Strings") python/DataStructuresGroup -.-> python/lists("Lists") python/FunctionsGroup -.-> python/function_definition("Function Definition") python/FunctionsGroup -.-> python/default_arguments("Default Arguments") python/PythonStandardLibraryGroup -.-> python/data_collections("Data Collections") subgraph Lab Skills python/variables_data_types -.-> lab-14103{{"Python 赋值与引用"}} python/numeric_types -.-> lab-14103{{"Python 赋值与引用"}} python/strings -.-> lab-14103{{"Python 赋值与引用"}} python/lists -.-> lab-14103{{"Python 赋值与引用"}} python/function_definition -.-> lab-14103{{"Python 赋值与引用"}} python/default_arguments -.-> lab-14103{{"Python 赋值与引用"}} python/data_collections -.-> lab-14103{{"Python 赋值与引用"}} end

Python 赋值简介

在 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]

在这个例子中,xy 都引用了同一个列表对象。当我们通过 y 引用修改列表,添加 4 时,这一变化会同时反映在 xy 中。

可变与不可变对象

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

示例

让我们再看几个示例,以巩固我们学到的概念:

示例 1:使用可变默认参数的函数

避免在函数中使用可变对象作为默认参数:

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]

示例 2:复制可变对象

当你需要处理可变对象的副本时,使用 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_listoriginal_list 的一个新副本。当我们向 copied_list 添加 4 时,original_list 保持不变。

示例 3:深拷贝可变对象

对于嵌套的可变对象,使用 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 代码。