[英]Python list processing issue
我需要用列表“ input_array”的元素更新列表“ array”的第一个元素。 问题:如果列表“数组”是由type2创建的,则它可以正常工作(元素在每次迭代中都会被替换)。 如果array是由Type1创建的,则所有元素在每次迭代中都会更新。
#TYPE1
#----------
array=[]
array_elem=['0.0']
for i in range(3):
array.append(array_elem)
print array
#TYPE2
#-------
array=[['0.0'],['0.0'],['0.0']]
print array
input_array=['35.0', '20.0', '15.0']
array_position=0
for elem in range(len(input_array)):
array[elem][array_position]=str(input_array[elem])
print "result",array
output with Type1:
[['0.0'], ['0.0'], ['0.0']]
[['0.0'], ['0.0'], ['0.0']]
result [['35.0'], ['35.0'], ['35.0']]
result [['20.0'], ['20.0'], ['20.0']]
result [['15.0'], ['15.0'], ['15.0']]
output with Type2:
[['0.0'], ['0.0'], ['0.0']]
[['0.0'], ['0.0'], ['0.0']]
result [['35.0'], ['0.0'], ['0.0']]
result [['35.0'], ['20.0'], ['0.0']]
result [['35.0'], ['20.0'], ['15.0']]
我需要像Type2中那样的结果..但是主数组将像Type1中那样动态创建。 两种创建列表的方式有什么区别?
提前致谢
这段代码:
array=[]
array_elem=['0.0']
for i in range(3):
array.append(array_elem)
将相同的列表放入array
三次。 要放置列表的副本 ,请使用切片:
array=[]
array_elem=['0.0']
for i in range(3):
array.append(array_elem[:]) # <--- [:] makes a copy of the full list
当你说:
array.append(array_elem)
您正在复制相同的参考。
如果你写了
array.append(['0'])
问题将消失。 如果您需要使用变量来初始化数组,请使用其副本,即array.append(copy.copy(array_elem))。 请参阅复制lib doc。
您的type1示例创建对 array_elem的引用 。 因此,当从一个引用更改array_elem时,所有引用都会更改。 您的type1方案的简化版本是这样的:
x = [0.0]
y = x # x and y now reference the same object
x[0] = 1.0
print(y)
> [1.0]
但是您的type2示例具有array_elem的单独副本:
x = [0.0]
y = [0.0] # x and y reference different objects
x[0] = 1.0
print(y)
> [0.0]
您可能会考虑对代码使用列表推导。 以下两个示例创建array_elem的副本 ,该副本与您从type2示例中获取的内容相匹配。
array = [[0.0] for _ in range(3)]
要么:
array = [list(array_elem) for _ in range(3)]
您的type1示例与以下速记相同。 此代码将创建对array_elem的引用:
array = [array_elem] * 3
array_elem:说这是在地址2000
数组代码是Array.append(array_elem)3个循环,因此此数组具有引用,可以表示为
2000 2000 2000
其中2000是array_elem的地址。
3.input_array = ['35.0','20 .0','15 .0']当执行“ array [elem] [array_position] = str(input_array [elem])”时。
4.在第一个循环数组将是数组[elem] [array_position] Elem:0 Position:0 a.so array [0] [0] = 35即array [0] [0]引用2000,即“ array_elem”的地址因此array_elem的值为35。b。在数组的连续索引(例如索引1和2)中也引用了地址2000,它是“ array_elem”的地址。
5.这将运行3个循环,最后15个会反映出来。 最终得到(15.0,15.0,15.0)。 随着循环的进行,array_elem的值将更改,并以15结尾。
希望这能解决问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.