聊聊Python中关于a=[[]]*3的反思

下面是详细的攻略:

1. 概述

在Python中,定义一个列表a时,如果使用a=[[]]*3,那么实际上创建的是包含3个空列表的大列表,即下面这样:

a = [[], [], []]

但是,这里会涉及到一个坑点,即这3个子列表是共享同一内存地址的,因此对一个子列表的修改,会影响到其他的子列表。这个坑点的主要原因是,*操作符实际上将列表复制了3次,但是这3个复制品指向同一内存地址,所以对任何一个复制品的操作,实际上都是同时操作了其他的复制品。

2. 示例说明

下面,我将给出两个示例,帮助大家更好地理解“共享内存地址”的问题:

示例1:修改一个元素

首先,让我们来看一个简单的示例,如下:

a = [[], [], []]
a[0].append(1)
print(a)  # 输出: [[1], [1], [1]]

上面的代码中,我们先定义了一个包含3个空列表的大列表,然后将第一个子列表的第一个元素赋值为1,最后打印这个大列表。

可以看到,这里并没有按照我们的预期打印出[[1], [], []],而是打印出了[[1], [1], [1]]。这是因为我们修改了a[0]的元素后,实际上修改了这个子列表对应的内存地址上的元素,而这个内存地址是被3个子列表共享的,所以其他两个子列表的元素也被修改了。

示例2:增加一个元素

接下来,我们再看一个稍微复杂一些的示例:

a = [[], [], []]
a[0].append(1)
a[1] = [2]
print(a)  # 输出: [[1], [2], []]

这个示例中,我们先像之前一样修改了第一个子列表的第一个元素,然后将第二个子列表赋值为[2],最后打印这个大列表。

可以看到,这里打印出了[[1], [2], []],这符合我们的预期。这是因为,虽然第一个子列表和第二个子列表实际上指向同一个内存地址,但是我们将第二个子列表直接赋值为[2],也就是创建了一个新的列表并将其指向了第二个子列表对应的内存地址,因此这个修改是没有影响到其他子列表的。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:聊聊Python中关于a=[[]]*3的反思 - Python技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • 测试、预发布后用python检测网页是否有日常链接

    测试、预发布后用Python检测网页是否有日常链接攻略 在测试、预发布环境中,我们需要检测网页是否有日常链接。本攻略将介绍如何使用Python检测网页是否有日常链接,包括获取网页源代码、解析HTML、检测链接等操作。 步骤1:获取网页源代码 在Python中,我们可以使用requests库获取网页源代码。以下是获取网页源代码的示例代码: import req…

    python 2023年5月15日
    00
  • 如何在Python中删除MongoDB数据库中的数据?

    以下是在Python中删除MongoDB数据库中的数据的完整使用攻略。 使用MongoDB数据库的前提条件 在使用Python连接MongoDB数据库之前,确保已MongoDB数据库,并已创建使用数据库和集合,同时需要安Python的驱动程序,例如pymongo。 步骤1:导入模块 在Python中使用pymongo模块连接MongoDB数据库。以下是导入p…

    python 2023年5月12日
    00
  • Python多进程分块读取超大文件的方法

    针对“Python多进程分块读取超大文件的方法”的问题,以下是完整攻略: 问题背景 在Python编程中,如果需要处理超大文件(比如上GB甚至更大)时,需要使用一些特殊的技术来防止内存占用过多,以及加快读取文件的速度。其中,使用多进程技术是一种较为常见的方法,可以同时利用多核CPU,以分块读取文件的方式来降低内存压力,实现对大文件的高效处理。 解决方案 下面…

    python 2023年5月19日
    00
  • python 读取txt,json和hdf5文件的实例

    Python是一种广泛使用的编程语言,支持多种数据格式的读取和处理。本文将详细讲解如何使用Python读取txt、json和hdf5文件。 读取txt文件 Python中读取txt文件,可以使用内置的open()函数。下面是一个读取txt文件的示例代码: with open(‘data.txt’, ‘r’) as f: data = f.read() pri…

    python 2023年6月3日
    00
  • 使用Python3中的gettext模块翻译Python源码以支持多语言

    使用Python3中的gettext模块可以轻松地将Python源码翻译成多种语言,实现国际化的目的。下面是使用gettext模块翻译Python源码的完整攻略: 创建翻译文件 首先,需要创建一个翻译文件 (.po 文件),该文件包含原始语言的翻译以及每个需要翻译的字符串。可以使用 gettext 工具根据 Python 源码生成翻译文件。 例如,假设我们要…

    python 2023年6月5日
    00
  • Python基础之类的定义和使用详解

    Python基础之类的定义和使用详解 1. Python基础数据类型的定义与使用 Python基础数据类型包括数字(整型、浮点型)、字符串、列表、元组、字典等。下面是它们的具体定义和使用方法: 1.1 数字类型 数字类型包括整型和浮点型。 # 整型变量定义 age = 18 # 浮点型变量定义 height = 1.75 # 四则运算 print(age +…

    python 2023年5月13日
    00
  • mac系统安装Python3初体验

    下面是“mac系统安装Python3初体验”的完整攻略。 1. 下载并安装Homebrew Homebrew是macOS上最流行的包管理工具,可以方便快捷地安装软件包。在终端执行以下命令安装Homebrew: /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homeb…

    python 2023年5月30日
    00
  • 关于Python错误重试方法总结

    关于Python错误重试方法总结 在使用Python进行编程的过程中,我们难免会遇到一些错误或者异常情况,如网络超时、链接断开等,当出现这些情况时,我们不可能直接放弃请求,因此需要对程序进行处理。本篇文章将详细讲解Python中错误重试的几种方式及其使用方法。 1. 简单重试方式 在Python中,我们可以通过使用try和except语句实现错误处理和重试,…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部