python开发中两个list之间传值示例

作者:程序员进化不脱发! 时间:2022-06-07 03:44:54 

由于改代码因为这个问题卡了半个小时特此记录

首先对于一个单层的列表

赋值如下,可以看见,如果直接使用 = 的话。其中一个变换便会引起另外一个变换,这时因为这两个list被python解释的时候使用的相同的地址,如下面输出的 id()中的内容,所以此时如果想让一个列表接收到另外一个列表的值,并且在接收到值后不会因为其中任意一个值的改变而改变,这时候就需要使用copy方法,这里可以解释成,当使用了copy方法后,python单独创建了找个一个内存区的地址放了新的那个值。


a = [ 1,2,3]
b = a
a[0] = a[0] +1
print(a)
print(b)
print(id(a[0]))
print(id(b[0]))
print("*"*20)
a1 = [5,6,7]
b1 = a1.copy()
a1[0] = a1[0] + 1
print(a1)
print(b1)
print(id(a1[0]))
print(id(b1[0]))

输出


[2, 2, 3]
[2, 2, 3]
140729246982592
140729246982592
********************
[6, 6, 7]
[5, 6, 7]
140729246982720
140729246982688

对于多层列表

这也是我今天被坑的地方,注意到了第一层,但却没有注意到第二层,如下可以看见,虽然我们使用了copy方法,但是内层[]则没有


a = [[1,2,4],[3,5,8],[],[]]
b = a.copy()
print("打印数组地址:")
print(id(a))
print(id(b))
print("*"*40)
print("打印内层元素地址:")
print(id(a[0]))
print(id(b[0]))
print(id(a[0][0]))
print(id(b[0][0]))
print("*"*40)
a.append(4)
a[1][0] = a[1][0] + 1
print(a)
print(b)
print(id(a[4]))

输出


打印数组地址:
1938878979528
1938879043976
****************************************
打印内层元素地址:
1938877731208
1938877731208
140729246982560
140729246982560
****************************************
[[1, 2, 4], [4, 5, 8], [], [], 4]
[[1, 2, 4], [4, 5, 8], [], []]
140729246982656

python开发中两个list之间传值示例

所以赋值操作应该为:


import copy
a = [[1,2,4],[3,5,8],[],[]]
# b = a.copy()
b =  copy.deepcopy(a)

即使用 copy.deepcopy 进行赋值操作,这时候当对a的内层元素进行操作之后,b不会跟着改变,
不过这里需要注意的是(不得不说这个设计节省内存真的很精妙),如果不更改a和b内部元素的值的话,那么a和b内部元素的值他们的地址还是相同的,只有在一方更改了自身地址内的值的时候,地址才会更改。


import copy
a = [[1,2,4],[3,5,8],[],[]]
# b = a.copy()
b =  copy.deepcopy(a)
print("打印数组地址:")
print(id(a))
print(id(b))
print("*"*40)
print("打印内层元素地址:")
print(id(a[0]))
print(id(b[0]))
print("0"*50)
print(id(a[0][0]))
print(id(b[0][0]))
print("10"*50)
print("\n")
print(a[1][0])
print(b[1][0])
print(id(a[1][0]))
print(id(b[1][0]))
print("10"*50)
print("\n")
# print("*"*40)
# a.append(4)
a[1][0] = a[1][0] + 1
#
# print(a)
# print(b)
# print(id(a[4]))
# print("\n")
print("10"*50)
print(a[1][0])
print(b[1][0])
print(id(a[1][0]))
print(id(b[1][0]))
print("10"*50)
print("\n")
b[1][0] = b[1][0] + 2
print(id(b[1][0]))

输出


打印数组地址:
1696261290248
1696261352200
****************************************
打印内层元素地址:
1696257692040
1694368707272
00000000000000000000000000000000000000000000000000
140729133343136
140729133343136
1010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010

3
3
140729133343200
140729133343200
1010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010

1010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010
4
3
140729133343232
140729133343200
1010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010

140729133343264

来源:https://blog.csdn.net/weixin_43134049/article/details/120069135

标签:python,list,传值
0
投稿

猜你喜欢

  • golang实现各种情况的get请求操作

    2024-04-25 15:30:15
  • 微信小程序webview组件交互,内联h5页面并网页实现微信支付实现解析

    2023-07-02 05:30:09
  • 利用pandas将非数值数据转换成数值的方式

    2023-05-18 15:17:17
  • JavaScript设计模式之模板方法模式原理与用法示例

    2024-02-24 02:17:20
  • mysql常用备份命令和shell备份脚本分享

    2024-01-13 14:37:35
  • javascript事件冒泡实例分析

    2023-07-02 05:29:58
  • JavaScript实现简单MD5加密的脚本分享

    2023-07-02 03:47:49
  • python中类的输出或类的实例输出为<__main__类名 object at xxxx>这种形式的原因

    2021-01-15 17:21:46
  • 网页HTTP header头信息详解

    2010-03-31 14:42:00
  • numpy matrix和array的乘和加实例

    2022-09-29 15:17:45
  • Django中日期时间型字段进行年月日时分秒分组统计

    2023-01-05 02:26:09
  • Sql Server中的事务介绍

    2024-01-22 01:04:37
  • Bootstrap媒体对象的实现

    2024-04-22 22:42:23
  • python 多线程将大文件分开下载后在合并的实例

    2023-05-12 06:27:36
  • 微信小程序顶部可滚动导航效果

    2024-04-29 13:55:34
  • Python数据可视化 pyecharts实现各种统计图表过程详解

    2022-04-08 17:28:37
  • Python-while 计算100以内奇数和的方法

    2022-03-24 12:00:39
  • python中日志logging模块的性能及多进程详解

    2023-08-17 23:19:07
  • golang中package is not in GOROOT报错的真正解决办法

    2024-04-28 10:45:29
  • fckeditor编辑器在php中的配置方法

    2023-10-14 14:26:52
  • asp之家 网络编程 m.aspxhome.com