聊聊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中,协程是一种轻量级的线程,它可以让我们按照需要挂起和恢复代码的执行,以达到异步的目的。而协程的返回值则是指,在协程执行完毕后,我们需要获取其返回的结果。 接下来,我将为大家详细讲解获取协程返回值的四种方式。 方法一:使用asyncio的gather函数 在Python的异步编程中,asyncio是一个提供异步…

    python 2023年6月6日
    00
  • Python-opencv实现红绿两色识别操作

    下面是Python-opencv实现红绿两色识别操作的完整攻略: 1. 安装OpenCV库 在终端中使用pip命令安装OpenCV库: pip install opencv-python 2. 读取图片 导入OpenCV库后,我们可以使用cv2.imread()函数读取图片。这个函数的参数是图片的路径。 import cv2 # 读取图片 img = cv2…

    python 2023年6月6日
    00
  • 基于python log取对数详解

    基于Python log取对数详解攻略 前言 在计算机、数学、自然科学等领域,我们经常需要对数据进行区间缩放或平滑处理,常用的方法就是对数据取对数。Python作为一种通用的编程语言,在这方面也提供了图形化界面。本文将介绍Python log取对数的基本方法,并提供两条示例来说明,希望能对广大Python爱好者有所启发。 基本方法 在Python中,可以使用…

    python 2023年6月3日
    00
  • Python的函数的一些高阶特性

    Python的函数是一等公民,拥有很多高阶特性,包括函数的嵌套、闭包、装饰器和匿名函数等。下面将分别进行详细讲解。 函数的嵌套 函数的嵌套指在一个函数内部定义另一个函数。这时候内部函数可以访问外部函数的局部变量,而外部函数无法访问内部函数的局部变量。嵌套函数的一种经典用法是实现装饰器。 示例代码: def decorator(func): def wrapp…

    python 2023年6月5日
    00
  • python嵌套try…except如何使用详解

    针对“python嵌套try…except如何使用详解”的问题,我提供以下攻略: 1. 基本用法 Python的 try…except 是一个异常处理机制,可以借助它在代码出错时作出相应反应,以保证程序正常运行。它的基本用法如下: try: # 可能会抛出异常的代码(包括其他可能抛出异常的代码块) except 注册的异常类型1: # 对应注册的异常…

    python 2023年5月13日
    00
  • Python之列表推导式最全汇总(上篇)

    以下是“Python之列表推导式最全汇总(上篇)”的完整攻略。 基本语法 列表推导式的基本语法形式为:[expression for item in iterable],其中expression是一个达式,item是可迭代对象中的元素,iterable是可迭代对象。以下是一个示例,演示如何使用列表推导式一个包含1到10的整数列表: # 生成包含1到10的整数…

    python 2023年5月13日
    00
  • Python 可迭代对象 iterable的具体使用

    针对 Python 可迭代对象 iterable 的具体使用,我为您整理了以下完整攻略: 1. 什么是可迭代对象 iterable 可迭代对象 iterable 是指能够提供一个迭代器 iterator 的对象,迭代器是一个带有 next() 方法并且返回一个迭代值的对象。通常,可迭代对象 iterable 包括 list、set、tuple、dict、st…

    python 2023年6月3日
    00
  • python数学模块(math/decimal模块)

    Python的math模块提供了常用的数学函数,decimal模块则提供了高精度计算功能,本文将详细介绍这两个模块的使用。 math模块 常用函数 标准库中math模块提供了许多数学计算函数,包括: math.ceil(x)返回大于等于x的最小整数。 math.floor(x)返回小于等于x的最大整数。 math.sqrt(x)返回x的平方根。 math.p…

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