python中list列表两表传值 python开发中两个list之间传值示例
程序员进化不脱发! 人气:0想了解python开发中两个list之间传值示例的相关内容吗,程序员进化不脱发!在本文为您仔细讲解python中list列表两表传值的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:python两列表传值,list列表传值,下面大家一起来学习吧。
由于改代码因为这个问题卡了半个小时特此记录
首先对于一个单层的列表
赋值如下,可以看见,如果直接使用 = 的话。其中一个变换便会引起另外一个变换,这时因为这两个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
所以赋值操作应该为:
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
加载全部内容