我需要更新列表"数组"的第一个元素,其中列表" input_array"元素。概率:如果列表"数组"是由Type2创建的,则可以正常工作(在每次迭代中都替换了元素)。如果由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文档。
您的type1示例为您的array_elem创建引用。因此,当Array_Elem从一个参考更改时,它会更改所有参考。类型1方案的简化版本是:
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]
您可以考虑使用代码的列表综合。以下两个示例CREATE copies 与您想要的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
中 数组代码是3个循环的Array.Append(Array_Elem)所以该数组的参考可以用作
的参考200020002000
其中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位置:0 A.SO数组[0] [0] = 35 IE数组[0] [0]是参考2000,它是" Array_Elem"的地址,因此Array_Elem的值为35。 b。在数组的连续索引索引1和2的连续索引中也提到了地址2000,这是" array_elem"的地址。
。5.最后15次运行3个循环。因此终于产生的(15.0,15.0,15.0)。随着循环的进行并以15。
结束,Array_Elem的值将更改。希望这将解决问题