【问题标题】:Assignning value with for loop in two dimensional arrays (matrixes in python)在二维数组中使用 for 循环赋值(python 中的矩阵)
【发布时间】:2020-08-19 04:12:32
【问题描述】:

我的代码是这样的。我想在 10-99 范围内添加随机数。当代码运行时,它会出现这样的问题。所有四行都变得相同。我也尝试用input 给出数字,但这次结果也是一样的。只有第一个给定的四个整数占据了所有四行。

import random

mx = [[0]*4] * 4

for i in range(4):

    for j in range(4):
        num = random.randint(10,99)
        mx[i][j] = num

#printing
for i in range(4):
    for j in range(4):
        print(mx[i][j],sep=" ",end=" ")
    print()

它给出了这个问题

C:\Users\Username\Desktop>python file.py
89 98 99 67
89 98 99 67
89 98 99 67
89 98 99 67

源代码有什么问题?

【问题讨论】:

标签: python python-3.x matrix multidimensional-array matrix-multiplication


【解决方案1】:

当您执行mx = [[0]*4] * 4 时,您不会创建一个包含零的列表。相反,您正在创建一个引用同一列表的列表。对其中一个列表所做的任何更改都会对所有列表进行更改。

看看相关问题:
1.List of lists changes reflected across sublists unexpectedly
2.How can I make multiple empty lists in python?
3.How to create a list or tuple of empty lists in Python?

对于 2D 列表,确实没有“干净”的方法。我建议使用numpy.zeros 或使用

 mx = [[0, 0, 0, 0], \
       [0, 0, 0, 0], \
       [0, 0, 0, 0], \
       [0, 0, 0, 0]]

【讨论】:

    【解决方案2】:

    mx = [[0]*4] * 4 只会复制同一个列表 4 次。它不会像您想要的那样创建 4 个单独的列表。您可以尝试类似下面的代码,在列表中创建单独的列表。

    mx = [None] * 4
    
    for i in range(4):
        mx[i] = [None] * 4
        for j in range(5):
            num = random.randint(10,99)
            mx[i][j] = num
    

    【讨论】:

      【解决方案3】:

      目标是只为您提供 4x4 阵列还是演示文稿? 数组可以通过这样的列表理解来实现:

      [print([random.randint(10,99) for x in range(4)]) for y in range(4)]

      输出:

      [15, 57, 37, 90]
      [40, 58, 39, 67]
      [97, 38, 84, 86]
      [14, 72, 50, 13]
      

      【讨论】:

      • 如果你想去掉括号和逗号,你可以在 print() 中使用星号解压,如下所示:[print(*[random.randint(10,99) for x in range(4)]) for y in range(4)]
      猜你喜欢
      • 1970-01-01
      • 2020-08-15
      • 2017-03-06
      • 2021-06-09
      • 2019-04-28
      • 2018-07-05
      • 2015-03-01
      • 1970-01-01
      • 2016-06-28
      相关资源
      最近更新 更多