为什么二维数组仅采用最后两个输入整数?

时间:2019-10-08 06:44:11

标签: python python-3.x

我已经用Java和C ++编程了一段时间。但是,我正在尝试学习Python,并试图在Python中初始化一个二维数组。为什么只需要最后两个输入?

我尝试了一切,但我不明白为什么它不起作用,应该是什么样。

   def prog2():
        x = int(input('x> '))
        y = int(input('y> '))
        pole = [[0] * x] * y

        for a in range(x):
            for b in range(y):
                pole[a][b] = int(input('> '))

        print(pole)
    prog2()

当我将xy定义为2时,以下四个输入分别定义为1、2、3、4 我希望输出为[[1,2],[3,4]]。 但是我得到了[[3,4],[3,4]]

x> 2
y> 2
> 1
> 2
> 3
> 4
[[3, 4], [3, 4]]

感谢您的耐心和帮助。 :)我是Python的新手。

3 个答案:

答案 0 :(得分:0)

更改:

pole = [[0] * x] * y

收件人:

pole = [0 for _ in range(x)] * y

要正确理解它,请运行以下代码:

lists = [[]] * 3
lists[0].append('hi')
print(lists)

输出:

[['hi'], ['hi'], ['hi']]

[0] * x仅被评估一次,并创建一个列表。 [[0] * x] * y创建一个列表,其中包含相同列表的y个引用。


详细了解this StackOverflow question中的行为。

答案 1 :(得分:0)

pole = [[0] * x] * y

将所有内部存储器地址设置为彼此相等(每个索引代表相同的对象)

更改您的初始化:

pole = [0 for _ in range(x)] * y

答案 2 :(得分:0)

您需要copy.deepcopy()。创建2-d数组的成员时,您要在同一1-d数组对象上进行复制,因此pole[0][0]的分配也分配给pole[1][0],依此类推。

#!/usr/bin/env python3
import copy
def prog2():
        x = int(input('x> '))
        y = int(input('y> '))
        pole = [[0] * x]
        for i in range(1, y):
            pole.append(copy.deepcopy(pole[0]))
        for a in range(x):
            for b in range(y):
                pole[a][b] = int(input('> '))

        print(pole)
prog2()