繁体   English   中英

Python列表处理问题

[英]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
  1. array_elem:说这是在地址2000

  2. 数组代码是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM