Python列表处理问题



我需要更新列表"数组"的第一个元素,其中列表" 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
  1. array_elem: 说这是在地址2000

  2. 数组代码是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的值将更改。

希望这将解决问题

最新更新