我已经用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()
当我将x
和y
定义为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的新手。
答案 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()