python生成列表坑

Python 生成只有重复元素(本例此重复元是空 list)的列表有两种方式:

  • 乘法(*)生成:[[]] * 3
  • 循环(for)生成:[[] for _ in range(3)]

这可能在初始化一个用以记录结果的嵌套数组时用到。两种方法生成的初始空数组看似一样,效果却同!

  • 前者内层的 3 个 list 其实是同一个(python 变量全是引用 / 一级指针,指向同一个),会互相影响;
  • 后者内层则是 3 个独立的 list,不会相互影响。

本文同时测试重复元为数时的一组对比:

  • [0] * 3,与
  • [0 for _ in range(3)]

Test

  • 第一组对比(a v.s. b),list 中 list,内层数组 append 数据;
  • 第二组对比(c v.s. d),list 中 int,对数做加法。
def inspect(arr, name):"""看数组各元素的值、地址"""for i in range(len(arr)):print(f"{name}[{i}]:", arr[i], id(arr[i]))a = [[]] * 3
print("init a:")
inspect(a, 'a')
for _ in range(4):a[0].append(1) # 只往内层第一个 list append 数据
print("after appending:")
inspect(a, 'a')b = [[] for _ in range(3)]
print("init b:")
inspect(b, 'b')
for _ in range(4):b[0].append(1) # 只往内层第一个 list append 数据
print("after appending:")
inspect(b, 'b')c = [0] * 3
print("init c:")
inspect(c, 'c')
for _ in range(4):c[0] += 1 # 只对第一个数 +1
print("after adding:")
inspect(c, 'c')d = [0 for _ in range(3)]
print("init d:")
inspect(d, 'd')
for _ in range(4):d[0] += 1 # 只对第一个数 +1
print("after adding:")
inspect(d, 'd')

输出:

init a:
a[0]: [] 2191561740608
a[1]: [] 2191561740608
a[2]: [] 2191561740608
after appending:
a[0]: [1, 1, 1, 1] 2191561740608
a[1]: [1, 1, 1, 1] 2191561740608
a[2]: [1, 1, 1, 1] 2191561740608init b:
b[0]: [] 2191563920704
b[1]: [] 2191563924480
b[2]: [] 2191563920960
after appending:
b[0]: [1, 1, 1, 1] 2191563920704
b[1]: [] 2191563924480
b[2]: [] 2191563920960init c:
c[0]: 0 140710718640904
c[1]: 0 140710718640904
c[2]: 0 140710718640904
after adding:
c[0]: 4 140710718641032
c[1]: 0 140710718640904
c[2]: 0 140710718640904init d:
d[0]: 0 140710718640904
d[1]: 0 140710718640904
d[2]: 0 140710718640904
after adding:
d[0]: 4 140710718641032
d[1]: 0 140710718640904
d[2]: 0 140710718640904

Discussion

两组对比初始化后,效果都看似相同,然而看地址就能发现并不是。

第一组 list 中 list:a 只让 a[0] append 数据,append 完 a[1]a[2] 也多了;而 b 同样只让 b[0] append,不影响 b[1]b[2]。再对比内层 list 的地址可知,* 生成的 a[0~2] 其实都指向同一个 list 对象,而 for 生成的 b[0~2] 则指向 3 个独立 list 对象。

第二组 list 中 int:无论 * 还是 for 生成,对第一维加数都不影响第二、三维。哦? 第二组对数操作的机制与第一组对 list 操作的机制不同,由地址可见所有常数 0 的地址都相同,即初始的 c[0~2] 都指向同一个 0(这与第一组类似),而初始的 d[0~2] 也指向同一个 0,且是与 c[0~2] 同一个,参考 [1,2]。而对第一维加数只会让 c[0]d[0] 改指向另一个常数(本例最终都指向同一个 4),并不是像 C 一样改值,而又不影响 c[1~2]d[1~2] 的指向,所以它们不受影响。

Conclusion

所以,list 中 list 无脑用 for 生成,避免副作用;list 中 int 则两种都行。

References

  1. 谈谈Python的常量池
  2. Are strings pooled in Python?

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

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

相关文章

解决go文件操作报错bad file descriptor

目录 问题解决 常见的打开模式 问题解决 出现于调用os.Open来打开的文件进行写操作时报的错,原因在于Open函数: func Open(name string) (*File,error) {return OpenFile(name, O_RDONLY, 0) } Open调用了OpenFile,而OpenFile默认以只读…

LeetCode 每日一题 Day 46 ||枚举

2744. 最大字符串配对数目 给你一个下标从 0 开始的数组 words &#xff0c;数组中包含 互不相同 的字符串。 如果字符串 words[i] 与字符串 words[j] 满足以下条件&#xff0c;我们称它们可以匹配&#xff1a; 字符串 words[i] 等于 words[j] 的反转字符串。 0 < i <…

如何批量修改文件名顺序编号?

如何批量修改文件名顺序编号&#xff1f;批量修改文件名顺序编号&#xff0c;指的是对多个文件名进行统一的修改&#xff0c;为每个文件名添加一个顺序编号。例如&#xff0c;将文件夹中的一组文件从"file1", "file2", "file3" 修改为 "001…

CentOS使用docker本地部署StackEdit Markdown编辑器并实现公网访问

文章目录 1. docker部署Stackedit2. 本地访问3. Linux 安装cpolar4. 配置Stackedit公网访问地址5. 公网远程访问Stackedit6. 固定Stackedit公网地址 StackEdit是一个受欢迎的Markdown编辑器&#xff0c;在GitHub上拥有20.7k Star&#xff01;&#xff0c;它支持将Markdown笔记保…

【JMeter】JMeter连OceanBase数据库

1、下载OB&#xff08;OceanBase简称&#xff0c;下同&#xff09;&#xff0c;下载地址&#xff1a;https://www.oceanbase.com/softwarecenter-enterprise 2、将下载下来的jar包放到jmeter安装目录的 lib 目录下&#xff0c;或者打开JMeter客户端&#xff0c;在测试计划中引入…

Tide Quencher 7.2 CPG 500A ,TQ7.2 CPG 500A,可以提高荧光标记物的淬灭效果

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;荧光淬灭剂Tide Quencher 7.2 CPG 500A&#xff0c;Tide Quencher 7.2 CPG 500A &#xff0c;TQ7.2 CPG 500A 一、基本信息 产品简介&#xff1a;The fluorescence quencher Tide Quencher 7.2 CPG 500A can quench…

如何卸载旧版docker

环境&#xff1a; Docker1.13 centos7.6 问题描述&#xff1a; 如何卸载旧版docker 解决方案&#xff1a; 1.停止Docker服务。使用以下命令停止Docker服务&#xff1a; sudo service docker stop2.卸载Docker软件包。根据您的Linux发行版&#xff0c;使用适当的包管理器来…

IP 地址如何进行动态分配?

由于 IP 地址资源的有限性&#xff0c;大部分用户上网都是使用动态 IP 地址&#xff0c;而不是静态 IP 地址。动态 IP 地址指的是在需要的时候才进行 IP 地址分配的方式&#xff0c;而静态 IP 地址是固定分配一个 IP 地址&#xff0c;每次都用这一个地址。因此&#xff0c;IP 地…

[三]H264编码和 MediaCodec

[三]H264编码和 MediaCodec 一.MediaCodec二.H264二.使用Nginx搭建自己的rtmp服务器1.nginx是什么&#xff1f;2.环境准备 三、搭建过程1.安装编译 nginx 所需要的库2.下载 nginx-1.21.6.tar.gz3.下载 nginx-rtmp-module 4.解压5.编译6.启动nginx&#xff0c;检测nginx是否能成…

使用Go语言处理Excel文件的完整指南

xcel文件是广泛用于存储和处理数据的常见文件格式。在Go语言中&#xff0c;有许多库和工具可用于处理Excel文件。本文将介绍如何使用Go语言处理Excel文件&#xff0c;包括读取、写入和修改Excel文件&#xff0c;以及处理单元格、行和列等操作。无论是从头开始创建Excel文件&…

算法练习-长度最小的子数组(思路+流程图+代码)

难度参考 难度&#xff1a;简单 分类&#xff1a;数组 难度与分类由我所参与的培训课程提供&#xff0c;但需要注意的是&#xff0c;难度与分类仅供参考。以下内容均为个人笔记&#xff0c;旨在督促自己认真学习。 题目 给定一个含有个正整数的数组和一个正整数s&#xff0c;找…

android 中一个app中打开另一个app

Android 在一个APP里打开另一个APP_android apk 内嵌其他apk的窗口-CSDN博客 项目&#xff1a;DemoA,DemoB

智慧门店:如何利用AI视频智能监管与存储技术让门店降本增效?

一、行业背景 TSINGSEE青犀视频智慧门店解决方案是一种集成了人工智能、大数据、物联网等技术的零售解决方案&#xff0c;目的是提高门店的运营效率、用户体验和业绩。随着数字化转型的加速&#xff0c;连锁门店需要跟上时代的步伐&#xff0c;需要利用数字化手段提高运营效率…

【记录】解决 git 仓库突然出现连接失败

问题描述 今天在 push 代码代码的时候突然发现无法 push(但是我可以正常打开 Gihub)&#xff0c;这可不行&#xff0c;我可是 git 的重度使用者&#x1f60d;&#xff0c;我所有的代码都托管在了 Github 上&#xff0c;没有它我的日子怎么活啊&#xff01;&#xff01;&#x…

Linux系统三剑客之grep和正则表达式的介绍(一)

1.正则表达式 目录 1.正则表达式 1.什么是正则表达式 &#xff1f; 2.正则表达式的使用场景 3.正则表达式字符表示 4.它们之间的区别 2.grep命令 作用&#xff1a; 语法&#xff1a; 说明&#xff1a; 选项&#xff1a;options 重点 实例 3.后面的下次再更新。 …

cf-920-div3

title: cf 920 div3 date: 2024-01-17 20:10:16 tags: vp categories: 比赛 A. Square 题目大意 给出四个坐标点&#xff0c;求正方形面积 解题思路 最小的最小&#xff0c;最大的最大。 代码实现 void solve() {int xmax -1e9, xmin 1e9, ymax -1e9, ymin 1e9;for (int …

始祖鸟母公司亚玛芬冲刺IPO:持续大额亏损,凸显安踏全球化野心

2024年赴美上市第一枪&#xff0c;由户外运动品牌始祖鸟母公司亚玛芬打响。 近日&#xff0c;安踏体育&#xff08;HK:02020&#xff0c;下称“安踏”&#xff09;旗下合营公司Amer Sports Holding&#xff08;Cayman&#xff09;Limited&#xff08;下称“AS Holding”&#…

Pyspark 安装(Mac M2版)

引言 本文为个人本地部署pyspark遇到的问题以及解决办法&#xff0c;包含个人的一些理解&#xff0c;仅供参考。设备&#xff1a; Mac M2 安装过程 安装HomeBrew Mac 上用来管理安装包的&#xff0c;可能早期的 Macos 自带但是起码我个人的 Mac 是需要安装的(以下安装方法个…

Jmeter-BeanShell脚本中for循环里面使用random随机数函数,每次生成的都一样

预想的是每次循环生成的随机数不一样&#xff0c;但实际使用Random函数生成的是重复的。 以下是部分原代码&#xff1a; List updateList new ArrayList(); for(Object o: fieldList){Map map new HashMap();map.put("id", o.get("id"));map.put("…

异步Merkle Tree

1. 引言 前序博客&#xff1a; 利用多核的Rust快速Merkle tree Anoushk Kharangate 2023年论文《Asynchronous Merkle Trees》&#xff0c;其对Merkle tree数据结构进行修改&#xff0c;使得可跨多线程异步计算。 开源代码实现见&#xff1a; https://github.com/anoushk1…