Pythonfor循环中使⽤append()添加可变元素,前⾯的值被覆
盖,循环中内存应⽤地址不变
在使⽤list.append(a), 添加动态改变的a(a = random.random())时,发现循环中每⼀个新的循环改变的a会在list中把之前的值全部改变;查后⾃了,Python是基于对象引⽤的,append添加的是⼀个“地址、引⽤”,当这个地址内的内容改变时,前⾯的同“地址”的内容都改变。查看“内存、应⽤”’使⽤ id(object).
简单的就不啰嗦了⽹上关于地址内存都有介绍,经过测试后发现,⼀般情况下给变量⼀个新值时这个id就会改变,当然这个值若是和以前相同这个id就⼀样。在for循环中这个情况就不⼀样
import random
def test():
return random.random()
def test1():
for i in range(3):
for i in range(2):
a = test()
print('a_id=',id(a))
结果是
a_id= 2566513744848
a_id= 2566513744872
a_id= 2566513744848
a_id= 2566513744872
a_id= 2566513744848
a_id= 2566513744872
可以看到内存分配时,对应内层2次循环的给了2个2个地址,节省开⽀;如果是这样的话使⽤list.append()最后就只有6个元素2个结果,但是
random在python中的意思import random
list_a = []
list = [1,2,3,4,5,6]
def test():
return random.random()
def test1():
for i in range(3):
for i in range(2):
a = test()
print('a_id=',id(a))
list_a.append(a)
print(list_a)
test1()
结果
a_id= 2566513744824
a_id= 2566513744848
a_id= 2566513744968
a_id= 2566513744992
a_id= 2566513745016
a_id= 2566513745040
[0.5481244502902065, 0.7452961787111314, 0.6038274060224955, 0.8269310521431017, 0.4091898711994284, 0.45233748625853376]
可以看到地址都改变了,Python在运⾏时⼜分配的、引⽤,所以前⾯的数值没有变化。
说了怎么多还没有到问题的重点;
import random
list_a = []
list = [[1,1,0,1,0], [1,0,1,1,1]]
def mutation(array):
array.append(random.randint(1,10))
return array
def test2():
for num in list:
for i in range(3):
a = mutation(num)
print(a)
print('a_id=',id(a))
list_a.append(a)
print(list_a)
test2()
[1, 1, 0, 1, 0, 8]
a_id= 2566513576904
[1, 1, 0, 1, 0, 8, 10]
a_id= 2566513576904
[1, 1, 0, 1, 0, 8, 10, 3]
a_id= 2566513576904
[1, 0, 1, 1, 1, 3]
a_id= 2566515364744
[1, 0, 1, 1, 1, 3, 5]
a_id= 2566515364744
[1, 0, 1, 1, 1, 3, 5, 4]
a_id= 2566515364744
[[1, 1, 0, 1, 0, 8, 10, 3],
[1, 1, 0, 1, 0, 8, 10, 3],
[1, 1, 0, 1, 0, 8, 10, 3],
[1, 0, 1, 1, 1, 3, 5, 4],
[1, 0, 1, 1, 1, 3, 5, 4],
[1, 0, 1, 1, 1, 3, 5, 4]]
结果可以看到我向list中添加了⼀个新的值,但在list中元素的改变并不会改变list的id,内层3个循环中list的id始终不变,
在加到list_a中的内层的3个循环中,始终是⼀个id,外层第⼀个循环结束后,取了此id的最后⼀个值,所以最后list_a的前3个值都相同。
实际上⽹上⼀个list⾥加字典例⼦和这个道理是⼀样的,双层循环的内存循环了不改变id的对象,
只是我写的时候把list变成其他形式了如([sum(list),,,]),原因时也就看了id和转换的结果发现好多结果都⼀样,
被其他的好多猜错试的好多,了好久才发现原因。
解决这个问题的办法是⽤copy,在
mutation(array) 中copy要return的array产⽣⼀个新的id,(array = py(array)),
⾄于是⽤浅拷贝还是深拷贝就要看array的维度。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论