python循环中对一个列表的赋值问题
参考:https://www.cnblogs.com/zf-blog/p/10613981.html
https://www.cnblogs.com/andywenzhi/p/7453374.html?tdsourcetag=s_pcqq_aiomsg
python的赋值方式是数据建立内存单元,将数据存入内存,然后再将变量名指向存储了数据的内存单元,如下图示:

不同于c的赋值方式:先为变量分配内存,然后再将变量的数据存入内存。

为了节省内存,如果将一个变量的值赋值给另一个变量,比如,b = 3, a = b,

变量a和b有完全一致的ID(指向同一内存地址)。
由于上述机制的存在,实际上没有为变量a分配内存,只是将a指向了变量b指向的内存地址。若对此不加注意,初学者就有可能出现感觉
很“怪异”的错误。比如有两个列表:
x = [[2, 3]]
y = [[4, 5], [5, 6], [7, 8], [9, 10]]
期望将y列表中的每个元素添加到x列表中组成新的列表z[i],所有的z[i]将组成新的列表:
z =
[[[2, 3],[4, 5]],[[2, 3],[5, 6]],[[2, 3],[7, 8]],[[2, 3],[9, 10]]]
如果这样编写程序:
def list2list(list_a, list_b):
list_mix, len_e = [], len(list_b)
for j in range(len_e):
list_c = list_a
id(list_c)
id(list_a)
print("改变list_c赋值之前二者id:", id(list_c), id(list_a))
list_c.append(list_b[j])
id(list_c)
id(list_a)
print("改变list_c赋值之后二者id:", id(list_c), id(list_a))
list_mix.append(list_c)
return list_mix x = [[2, 3]]
y = [[4, 5], [5, 6], [7, 8], [9, 10]] if __name__ == '__main__':
z = list2list(x, y)
print(z)
其输出为:
改变list_c赋值之前二者id: 53391968 53391968
改变list_c赋值之后二者id: 53391968 53391968
改变list_c赋值之前二者id: 53391968 53391968
改变list_c赋值之后二者id: 53391968 53391968
改变list_c赋值之前二者id: 53391968 53391968
改变list_c赋值之后二者id: 53391968 53391968
改变list_c赋值之前二者id: 53391968 53391968
改变list_c赋值之后二者id: 53391968 53391968
[[[2, 3], [4, 5], [5, 6], [7, 8], [9, 10]], [[2, 3], [4, 5], [5, 6], [7, 8], [9, 10]], [[2, 3], [4, 5], [5, 6], [7, 8], [9, 10]], [[2, 3], [4, 5], [5, 6], [7, 8], [9, 10]]]
从中可以看出,无论有没有对列表list_c的赋值进行添加更改,列表list_c和list_a的id都是完全一致的,这表明二者共用了内存地址。若对其中一个列表
list_c的赋值进行更改,则对应内存地址中的数据将更改,由于另一列表list_a与其共用数据内存,所以list_a的赋值也被“莫名其妙”地更改了,导致输出
结果与预期大相径庭。关键问题在于列表赋值更改方式(.append)。可对比下例:
def add02(a, b):
len_b = len(b)
d = []
for i in range(len_b):
c = a
print("c和a赋值更改前的id:", id(c), id(a))
c += 1
print("c和a赋值更改后的id:", id(c), id(a))
e = c + b[i]
d.append(e)
return d
x = 5
y = [6, 7, 8, 9, 10] if __name__ == '__main__':
z = add02(x, y)
print(z) 输出:
c和a赋值更改前的id: 259024032 259024032
c和a赋值更改后的id: 259024048 259024032
c和a赋值更改前的id: 259024032 259024032
c和a赋值更改后的id: 259024048 259024032
c和a赋值更改前的id: 259024032 259024032
c和a赋值更改后的id: 259024048 259024032
c和a赋值更改前的id: 259024032 259024032
c和a赋值更改后的id: 259024048 259024032
c和a赋值更改前的id: 259024032 259024032
c和a赋值更改后的id: 259024048 259024032
[12, 13, 14, 15, 16]
可将上文中list2list()改为:
def add_element(a, b):
c = a + b
return c
def list2list(list_b, list_e):
list_mix, len_e = [], len(list_e)
list_c = list_b * len_e
list_mix = list(map(add_element, list_c, list_e))
return list_mix
if __name__ == '__main__':
x = [[[2, 3]]]
y = [[[4, 5]], [[5, 6]], [[7, 8]], [[9, 10]]]
route = list2list(x, y)
print("route:", route) 输出:

python循环中对一个列表的赋值问题的更多相关文章
- Java循环中删除一个列表元素
本文主要想讲述一下我对之前看到一篇文章的说法.假设跟你的想法有出入,欢迎留言.一起讨论. #3. 在循环中删除一个列表元素 考虑以下的代码.迭代过程中删除元素: ArrayList<String ...
- .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
林德熙 小伙伴希望保存一个文件,并且希望如果出错了也要不断地重试.然而我认为如果一直错误则应该对外抛出异常让调用者知道为什么会一直错误. 这似乎是一个矛盾的要求.然而最终我想到了一个办法:让重试一直进 ...
- 如何python循环中删除字典元素
//下面这行就是在循环中遍历删除字典元素的方法! for i in list(dictheme2.keys()): if dictheme2[i]<self.countFortheme: dic ...
- JavaScript的for循环中嵌套一个点击事件为何点击一次弹出多个相同的值
先看下面一段代码: for(var i=0; i<10; i++) { $('#ul').bind('click', function() { alert(i) }) } 对于这段代码,当点击I ...
- JavaScript中对数据库表中某一个字段进行赋值
场景如下,通过下拉列表选择一个选项(如“启用”和“不启用”),启用用0表示,不启用用1表示. enableFlag是表中一个字段,我猜date:后面就是对该字段的赋值.
- python 编程中的一个关于图片的库 imageio (读取照片RGB内容,转换照片格式)
最近在看机器学习方面的东西,经常遇到需要把某个类型的照片中 RGB 内容读取出来, 在python中照片显示用matplotlib就可以做到,但是导入不同格式的照片,保持出不同格式的照片numpy, ...
- python 循环中使用多个subplot画子图像(python matplotlib use more than one subplot in loop)
在循环语句中画出多个subplot图像代码如下 http://jonathansoma.com/lede/data-studio/classes/small-multiples/long-explan ...
- volist/foreach下,点击循环中的一个进行操作
第一种方法,是给点击元素绑定事件,用ajax将值传到控制器中,其中传的值,用jquery选择器选择值. 1.在html中 <foreach name="save" item= ...
- 【错误记录】windows python 路径中的一个转义错误:'rawunicodeescape' codec can't decode bytes in position 112-113: truncated \uXXXX
ur"D:\work\结构化\CSV\useful\内容.csv" 报错 编码错误原因,当路径中有\u这种字串时,即使是包含在r"" 中也会进行转义,然后转义出 ...
随机推荐
- Java 基础讲解
Hello,老同学们,又见面啦,新同学们,你们好哦! 在看完本人的<数据结构与算法>专栏的博文的老同学,恭喜你们在学习本专栏时,你们将会发现好多知识点都讲解过,都易于理解,那么,没看过的同 ...
- tensorflow1.0 模型的保存与加载
import tensorflow as tf import numpy as np # ##Save to file # W = tf.Variable([[4,5,6],[7,8,9]],dtyp ...
- TensorFlow1.0 线性回归
import tensorflow as tf import numpy as np #create data x_data = np.random.rand(100).astype(np.float ...
- 数据挖掘入门系列教程(十点五)之DNN介绍及公式推导
深度神经网络(DNN,Deep Neural Networks)简介 首先让我们先回想起在之前博客(数据挖掘入门系列教程(七点五)之神经网络介绍)中介绍的神经网络:为了解决M-P模型中无法处理XOR等 ...
- webug3.0靶场渗透基础Day_2(完)
第八关: 管理员每天晚上十点上线 这题我没看懂什么意思,网上搜索到就是用bp生成一个poc让管理员点击,最简单的CSRF,这里就不多讲了,网上的教程很多. 第九关: 能不能从我到百度那边去? 构造下面 ...
- Cannot find or open the PDB file
打开VS:工具 --> 选项 --> 调试-->符号接下来就是选择Microsoft,然后确认
- Prometheus+Grafana 监控 Docker
cAdvisor (Container Advisor) :用于收集正在运行的容器资源使用和性能信息. https://github.com/google/cadvisor Prometheus(普罗 ...
- 怎么在java中关闭一个thread
怎么在java中关闭一个thread 我们经常需要在java中用到thread,我们知道thread有一个start()方法可以开启一个线程.那么怎么关闭这个线程呢? 有人会说可以用Thread.st ...
- 从Spring迁移到Spring Boot
文章目录 添加Spring Boot starters 添加应用程序入口 Import Configuration和Components 迁移应用程序资源 迁移应用程序属性文件 迁移Spring We ...
- CSS常用遮罩层
为什么80%的码农都做不了架构师?>>> CSS常用遮罩层 应用场景: 上传了一张图片,鼠标移入到图片上的时候显示遮罩层,并且提示点击删除. 通过改变遮罩层的透明度来实现显示隐藏 ...