【问题标题】:How to change values in a matrix?如何更改矩阵中的值?
【发布时间】:2017-04-22 15:14:35
【问题描述】:

我正在尝试在 Python 中创建一个 12x12 矩阵。我将所有位置设置为"High",然后尝试将一个特定位置设置为"Low"。在打印命令中,两个都是"Low",而我希望第一个是"Low",我希望第二个仍然是"High",因为它没有改变(我想)。我做错了什么?

HourlyUsageBlock = ["High" for x in range(12)]
WorkDayUsageBlock = [HourlyUsageBlock for x in range(12)]
Hour = 2
MinBlock = 6
WorkDayUsageBlock [MinBlock][Hour] = "Low"
print (WorkDayUsageBlock[6][2])
print (WorkDayUsageBlock[10][2])

【问题讨论】:

  • 你做错了什么是你在WorkDayUsageBlock中引用了同一件事(HourlyUsageBlock)。您的理解不会产生 copy ,它只是指向它。 WorkDayUsageBlock 是指向相同 HourlyUsageBlock 的事物的列表。
  • @pvg:不,不是那个问题 IMO 的重复。
  • 谢谢,我将前两行替换为:WorkDayUsageBlock = [["High" for x in range(12)] for y in range(12)] 并且它有效
  • 题外话:如果您要编写大量 Python 代码,我建议您阅读并关注 PEP 8 - Style Guide for Python Code。它将使您的代码对其他人(最终对您自己)更具可读性。

标签: python list matrix


【解决方案1】:

当您初始化WorkDayUsageBlock 时,您基本上在每个位置都放置了相同的HourlyUsageBlock。由于 WorkDay 中的所有元素都是同一个列表,因此更改一个将更改所有。

试试这个解决方案:

WorkDayUsageBlock = [["high" for x in range(12)] for y in range(12)]

或者,您可以使用 lst.copy():

WorkDayUsageBlock = [HourlyUsageBlock.copy() for x in range(12)]

我建议你阅读 Python 中的可变和不可变对象。

【讨论】:

  • 在 Python 2 中,list 对象如 HourlyUsageBlock 没有 copy() 方法,并且直到 Python 3.3 才添加。但是,在 Python 2 和 3 中,都可以使用 [HourlyUsageBlock[:] for _ in range(12)] 获取 list 实例的副本。
【解决方案2】:
>>> print (WorkDayUsageBlock)
[['High', 'High', 'Low', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High'], ['High', 'High', 'Low', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High'], ['High', 'High', 'Low', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High'], ['High', 'High', 'Low', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High'], ['High', 'High', 'Low', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High'], ['High', 'High', 'Low', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High'], ['High', 'High', 'Low', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High'], ['High', 'High', 'Low', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High'], ['High', 'High', 'Low', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High'], ['High', 'High', 'Low', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High'], ['High', 'High', 'Low', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High'], ['High', 'High', 'Low', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High', 'High']]

您可以看到每行的第三个元素都是“低”,因为理解只使用相同的 HourlyUsageBlock。因此,当您更改第三个元素的值时,它会反映在每一行中,因为理解不会复制 HourlyUsageBlock

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-17
    • 2021-09-10
    • 2017-03-29
    • 2018-01-19
    • 2011-10-14
    • 1970-01-01
    • 2021-12-11
    相关资源
    最近更新 更多