参考: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循环中对一个列表的赋值问题的更多相关文章

  1. Java循环中删除一个列表元素

    本文主要想讲述一下我对之前看到一篇文章的说法.假设跟你的想法有出入,欢迎留言.一起讨论. #3. 在循环中删除一个列表元素 考虑以下的代码.迭代过程中删除元素: ArrayList<String ...

  2. .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter

    林德熙 小伙伴希望保存一个文件,并且希望如果出错了也要不断地重试.然而我认为如果一直错误则应该对外抛出异常让调用者知道为什么会一直错误. 这似乎是一个矛盾的要求.然而最终我想到了一个办法:让重试一直进 ...

  3. 如何python循环中删除字典元素

    //下面这行就是在循环中遍历删除字典元素的方法! for i in list(dictheme2.keys()): if dictheme2[i]<self.countFortheme: dic ...

  4. JavaScript的for循环中嵌套一个点击事件为何点击一次弹出多个相同的值

    先看下面一段代码: for(var i=0; i<10; i++) { $('#ul').bind('click', function() { alert(i) }) } 对于这段代码,当点击I ...

  5. JavaScript中对数据库表中某一个字段进行赋值

    场景如下,通过下拉列表选择一个选项(如“启用”和“不启用”),启用用0表示,不启用用1表示. enableFlag是表中一个字段,我猜date:后面就是对该字段的赋值.

  6. python 编程中的一个关于图片的库 imageio (读取照片RGB内容,转换照片格式)

    最近在看机器学习方面的东西,经常遇到需要把某个类型的照片中 RGB 内容读取出来, 在python中照片显示用matplotlib就可以做到,但是导入不同格式的照片,保持出不同格式的照片numpy, ...

  7. python 循环中使用多个subplot画子图像(python matplotlib use more than one subplot in loop)

    在循环语句中画出多个subplot图像代码如下 http://jonathansoma.com/lede/data-studio/classes/small-multiples/long-explan ...

  8. volist/foreach下,点击循环中的一个进行操作

    第一种方法,是给点击元素绑定事件,用ajax将值传到控制器中,其中传的值,用jquery选择器选择值. 1.在html中 <foreach name="save" item= ...

  9. 【错误记录】windows python 路径中的一个转义错误:'rawunicodeescape' codec can't decode bytes in position 112-113: truncated \uXXXX

    ur"D:\work\结构化\CSV\useful\内容.csv" 报错 编码错误原因,当路径中有\u这种字串时,即使是包含在r"" 中也会进行转义,然后转义出 ...

随机推荐

  1. vue2.x学习笔记(十三)

    接着前面的内容:https://www.cnblogs.com/yanggb/p/12595860.html. 组件的注册 注册组件有一些规范约定与注意事项. 组件名的命名规范 在注册一个组件的时候, ...

  2. testNG 下载安装

    testNG的安装方法: 一.在线安装 打开eclipse 选择-->help-->Install New Software选项 ,弹出下面的弹框,Work with框输入 http:// ...

  3. Springboot:员工管理之删除员工及退出登录(十(9))

    springboot2.2.6 delete请求报错,降至2.1.11功能可用 原因未知 构建员工删除请求 com\springboot\controller\EmployeeController.j ...

  4. 数字签名---RSA算法

    保证信息在传输过程中的安全性:             保密通信.密钥交换.数字签名.   RSA算法 Diffie-Hellman算法 DSA算法 保密通信 √ × × 密钥交换 √ √ × 数字签 ...

  5. 在php中如何实现cookie即时生效,不用刷新就可以使用

    参考:https://www.jianshu.com/p/0468ef5dbf4d 今天在用php设置cookie的时候,发现cookie如果只是赋值一次的话,要手动刷新一下浏览器才能把数据及时更新, ...

  6. 编程是要偷懒的--option简练写法

    没改前: if(!empty($search)){ $where['personal_name'] = array('like','%'. $search . '%'); $this -> as ...

  7. 深入理解TCP建立和关闭连接

    建立连接: 理解:窗口和滑动窗口TCP的流量控制TCP使用窗口机制进行流量控制什么是窗口?连接建立时,各端分配一块缓冲区用来存储接收的数据,并将缓冲区的尺寸发送给另一端 接收方发送的确认信息中包含了自 ...

  8. Lambda表达式最佳实践

    简介 Lambda表达式java 8引入的函数式编程框架.之前的文章中我们也讲过Lambda表达式的基本用法. 本文将会在之前的文章基础上更加详细的讲解Lambda表达式在实际应用中的最佳实践经验. ...

  9. MYSQL 索引汇总

    1.MySQL索引类型 先分以下类,MYQL有两大类索引:聚集索引和非聚集索引(只考虑mysql innodb) 聚集索引:在有主键的情况下,主键为聚集索引,其他都是非聚集索引             ...

  10. Python 正则表达式——re模块介绍

    Python 正则表达式 re 模块使 Python 语言拥有全部的正则表达式功能,re模块常用方法: re.match函数 re.match从字符串的起始位置匹配,如果起始位置匹配不成功,则matc ...