【问题标题】:Python 3 - Am I correctly using indexing?Python 3 - 我是否正确使用索引?
【发布时间】:2017-01-30 05:36:18
【问题描述】:

我正在编写一个小程序,它需要 4 个数字 (173,210,94,164) 并执行以下操作:

  1. 新集合中的第一个数字将是第一个和第二个数字之差的绝对值。 (例如abs(173-210) -> 37
  2. 集合中的第二个数字是第二个和第三个数字之差的绝对值(例如abs(210-94) -> 116),依此类推,以第一个和第四个数字在末尾循环.

对于这些数字,第二组应该看起来像(37, 116, 70, 9),但是当我运行我的代码时,我得到了(37, 116, 70, 127)。是什么让最后一个数字 127 而不是 9

numbers = [173, 210, 94, 164]
counter = 0
while numbers != [0, 0, 0, 0]:
    oldnums = numbers
    numbers[0] = abs(oldnums[0] - oldnums[1])
    numbers[1] = abs(oldnums[1] - oldnums[2])
    numbers[2] = abs(oldnums[2] - oldnums[3])
    numbers[3] = abs(oldnums[3] - oldnums[0])
    print(numbers)
    counter += 1
print('Number of iterations to (0,0,0,0): ' + str(counter))

【问题讨论】:

  • oldnums = numbers 为一个列表提供两个名称 - 当您分配数字时,您也在更改 oldnums。使用oldness = numbers[:]oldness = list(numbers) 制作一个在您修改其他列表时不会被修改的副本。

标签: python list python-3.x indexing


【解决方案1】:

问题是您再次使用已更新的值。 oldnumbers = numbers 不会进行复制,因此当您计算最后一个值时:numbers[3] = abs(oldnums[3] - oldnums[0]) 您使用新的 numbers[0](与 oldnums[0] 相同)值 - 这不是您想要的。

但是,您根本不需要复制该列表。 Python可以解包:

numbers = [173, 210, 94, 164]
counter = 0
while numbers != [0, 0, 0, 0]:
    numbers[:] = (abs(numbers[0] - numbers[1]), 
                  abs(numbers[1] - numbers[2]), 
                  abs(numbers[2] - numbers[3]), 
                  abs(numbers[3] - numbers[0]))
    print(numbers)
    counter += 1
print('Number of iterations to (0,0,0,0): ' + str(counter))

【讨论】:

  • numbers[:] 最后一项是什么?
  • : 表示所有项目都可以访问。在这种情况下,这意味着所有项目都被覆盖。
【解决方案2】:

numbers 是一个指针,它指向内存中存储[173, 210, 94, 164] 的位置。 当您执行oldnums = numbers 时,您正在使oldnums 指向相同的内存位置。 因此,您对数字指向的数据所做的任何更改也会反映在oldnums 中。为了您的目的,您可以使用

oldnums = 列表(数字)

【讨论】:

    猜你喜欢
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 2011-02-19
    • 2016-01-24
    • 2014-05-15
    相关资源
    最近更新 更多