python中[[]] * (n)和[[] for _ in range(n)]的区别

1、现象

刷leetcode207的时候碰到一个坑,用[[]] * (n)初始化二维数组,逻辑是正确的,但是结果始终不对。

2、原因

最后定位是初始化语句使用错误导致的,我使用的是[[]] * (n),应该使用[[] for _ in range(n)]

3、解释

[[]] * (n)和[[] for _ in range(n)]打印结果完全一样,但是原理却不一样

[[]] * (n)表示复制子列表( 此处为[] ) n次,这些子列表指向或引用相同的对象,也就是内存地址一样,因此修改其中一个子列表元素,会同时影响其他子列表的值,如下面代码中的L1

[[] for _ in range(n)] 表示列表的子列表元素是每次for循环创建的新对象,这些子列表指向或引用不同的对象,内存地址当然也不一样,因此修改其中一个子列表元素,不会影响其他子列表的值,如下面代码中的L2

n = 2
L1 = [[]] * n
L2 = [[] for _ in range(n)]
print(f'L1:{L1}, L2:{L2}')
print(L2 == L2)   #值相等
print(id(L1[0]),id(L1[1])) # L1列表内的元素,地址相同
print(id(L2[0]),id(L2[1])) # L2列表内的元素,地址不同
L1[0].append(1)
L2[0].append(1)
print(f'L1:{L1}, L2:{L2}')

打印结果:

4、注意

L1 中的元素是列表,是可变对象,使用*n复制,不同元素才会指向同一个对象,但是如果L1中元素是不可变对象,比如int、string、float、tuple,使用*n复制的时候,不同元素也会指向同一个元素,但是修改时,由于是不可变对象,修改时会重新开辟一块内存,变量指向新地址,这样修改其中一个元素,不会影响其他元素

i = 2
L1 = [2] * i   # 列表元素为不可变对象 int
print(L1)
print(id(L1[0]),id(L1[1]))
L1[0] = 4
print(id(L1[0]),id(L1[1]))
print(L1)

打印结果为

5、其他

可变数据类型:列表list[ ]、字典dict{ }

不可变数据类型:整型int、字符串str' '、元组tuple()浮点数float

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/452361.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(十)流程控制经典案例

文章目录 最大公约数,最小公倍数现象水仙花数现象 最大公约数,最小公倍数 最大公约数: 最大体现在:最大也只能是两个数中最小的那个数 公约体现在:两个数全都能被某个数整除 还有个公式求其一,就知道另一…

MySQL 教程 2.3

MySQL DELETE 语句 你可以使用 DELETE FROM 命令来删除 MySQL 数据表中的记录。 你可以在 mysql> 命令提示符或 PHP 脚本中执行该命令。 语法 以下是 DELETE 语句从 MySQL 数据表中删除数据的通用语法: DELETE FROM table_name WHERE condition; 参数说明&…

【Linux网络编程三】Udp套接字编程网络应用场景

【Linux网络编程三】Udp套接字编程网络应用场景 应用场景一:远程命令执行应用场景二:与Windos端相互通信应用场景三:简单聊天1.多线程化2.输入输出分开 应用场景一:远程命令执行 简单的服务器上一篇已经完成,接下来我…

r0下进程保护

简介 SSDT 的全称是 System Services Descriptor Table,系统服务描述符表。这个表就是一个把 Ring3 的 Win32 API 和 Ring0 的内核 API 联系起来。SSDT 并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基地…

DFS——连通性和搜索顺序

dfs的搜索是基于栈,但一般可以用用递归实现,实际上用的是系统栈。有内部搜索和外部搜索两种,内部搜索是在图的内部,内部搜索一般基于连通性,从一个点转移到另一个点,或者判断是否连通之类的问题&#xff0c…

赎金信[简单]

优质博文:IT-BLOG-CN 一、题目 给你两个字符串:ransomNote和magazine,判断ransomNote能不能由magazine里面的字符构成。如果可以,返回true;否则返回false。magazine中的每个字符只能在ransomNote中使用一次。 示例 …

使用wda框架实现IOS自动化测试详解

目录 1、weditor元素定位工具 1.1、weditor的安装和使用 2、wda iOS自动化框架 2.1、wda概述 2.2、wda安装 2.3、wda的使用 2.3.1、全局配置 2.3.2、创建客户端 2.3.3、APP相关操作 1、启动APP 2、关闭APP 3、获取APP状态信息 4、获取当前APP的运行信息 2.3.4、设…

BP图片降噪MATLAB代码

BP(Back Propagation)神经网络是一种常用的深度学习模型,可以用于图像降噪。主要步骤包括: 构建BP神经网络模型。包括输入层、隐藏层和输出层。输入层大小与图像大小相同,输出层大小也与输入图像大小相同。隐藏层根据图像复杂度设定。 准备训练数据。使用干净图像作为输入,加…

《计算机网络简易速速上手小册》第10章:未来网络技术趋势(2024 最新版)

文章目录 10.1 边缘计算与网络设计 - 未来网络的速度与激情10.1.1 基础知识10.1.2 重点案例:使用 Python 实现边缘计算的实时视频分析准备工作Python 脚本示例 10.1.3 拓展案例1:智能交通系统Python 脚本示例 - 边缘计算设备上的交通流量分析 10.1.4 拓展…

Qt之使用Qt内置图标

一效果 二.原理 Qt内置图标封装在QStyle中,共七十多个图标,可以直接拿来用,能应付不少简单程序需求,不用自己去找图标并添加到资源文件了。 下面是内置图标的枚举定义: enum StandardPixmap {SP_TitleBarMenuButton,SP_TitleBarMinButton,SP_TitleBarMaxButton,SP_T…

如何实现冻干机和产品全生命周期的验证和监测?

为什么冻干需要工艺优化和合规性 冻干是制药和生物技术产品的关键工艺,需要精确控制关键的温度和压力参数。通过遵守 GMP 和 FDA 合规性等监管准则,您可以生产出更高质量的产品,避免不必要的浪费,并缩短产品上市时间。 要想在冻干…

ArcGIS Pro 按照字段进行融合或拆分

ArcGIS Pro 按字段融合 在ArcGIS Pro中,通过使用“融合”工具可以轻松地合并具有相同字段的图层。 步骤一:打开ArcGIS Pro 启动ArcGIS Pro应用程序,确保您已经登录并打开您的项目。 步骤二:添加图层 将包含相同字段的图层添加到…