【问题标题】:Why doesn't the array change when I try to modify it via a for-loop [duplicate]当我尝试通过for循环修改数组时,为什么数组没有改变[重复]
【发布时间】:2021-05-02 13:55:54
【问题描述】:

我在 JavaScript 学习 3 年后才开始学习 Python,我很难理解为什么以下内容不会改变现有数组?

我基本上只是想将每个数组修剪为前 5 个元素。

data = [[1619740800000, '54474.27000000', '108499.98000000', '30000.00000000', '56989.21000000', 
'5.74916200', 1619827199999, '332834.07665858', 23971, '4.30590700', '251576.63190168', '0'], 
[1619827200000, '56989.21000000', 
'105053.04000000', '12000.00000000', '57794.45000000', '10.12076500', 1619913599999, 
'612746.95919066', 45086, '9.12267500', '557156.21495534', '0'], [1619913600000, '57797.36000000', 
'98900.00000000', '30000.00000000', '56539.47000000', '6.05304600', 1619999999999, '334919.15726802', 
 28754, '5.03377800', '284764.41259450', '0']]

我的 for 循环:

for x in data:
  x = x[:5]

# print(data) outputs the same as above

【问题讨论】:

  • data = [x[:5] for x in data]。问题是:您不能以这种方式分配给列表的元素...(x 只会引用您的一些数据,但 x 与您的列表不再有任何关系)。跨度>
  • 忘了添加:在这种情况下,您还可以使用slice-assignment 来就地修改嵌套列表:x[:] = x[:5]

标签: python arrays for-loop


【解决方案1】:

“我很难理解为什么以下内容不会改变现有数组?”

我认为你的实际问题是为什么你尝试的方法不起作用,而不是具体如何正确地做,但我会解决这两个问题。

据我了解,原因是虽然 x 变量是,但在每次迭代中分配了您要查找的结果 (x[:5]),但结果未存储在您的 data 数组中。在单次迭代期间,它只是存储在x 变量中,它是数组中元素的副本,而不是对元素本身的引用。和做的不一样

for i in range(len(data)):
    data[i] = data[i][:5]  # explicitly sets the element

显式设置数组元素

作为确认,请参见:

data = [[1,2,3,4], [5,6,7,8]]
for x in data:
    x = x[:2]  # does indeed set x, but only x
    print(x)

[1,2]
[5,6]
>> print(data)    # but data array is unchanged
[[1,2,3,4], [5,6,7,8]

或者,请参阅此(列表理解):

data = [x[:5] for x in data]  
# this creates a new array, and stores it in data, but has the outcome you want

【讨论】:

  • 谢谢我明白了。我确实喜欢语法 data = [x[:5] for x in data] ,我使用过这个,但我也明白为什么第一个示例默认会起作用。干杯
  • x 变量不是代码块的本地变量。
  • @Niloct 你是对的,我的错误,已编辑
【解决方案2】:

去做吧:

data = [[1619740800000, '54474.27000000', '108499.98000000', '30000.00000000', '56989.21000000', 
'5.74916200', 1619827199999, '332834.07665858', 23971, '4.30590700', '251576.63190168', '0'], 
[1619827200000, '56989.21000000', 
'105053.04000000', '12000.00000000', '57794.45000000', '10.12076500', 1619913599999, 
'612746.95919066', 45086, '9.12267500', '557156.21495534', '0'], [1619913600000, '57797.36000000', 
'98900.00000000', '30000.00000000', '56539.47000000', '6.05304600', 1619999999999, '334919.15726802', 
 28754, '5.03377800', '284764.41259450', '0']]

for i in range(len(data)):
    data[i] = data[i][:5]

【讨论】: