【问题标题】:Python: How do I use tuples in lists?Python:如何在列表中使用元组?
【发布时间】:2021-08-29 00:58:56
【问题描述】:

我的这段代码不能按我预期的方式工作。我正在尝试制作网格。它应该从列表中输出元组,但它卡在第一个数字上。

我的逻辑有问题吗?

row = []
grid = []

for y in range(0,3):
    row.append((0,0))

for x in range(0,3):
    grid.append(row)


for y in range(0, 3):
    for x in range (0, 3):
        print (x,y)
        grid[x][y] = (x,y)
        print (grid[x][y])

print ("\nTesting:")
for y in range(0, 3):
    for x in range (0, 3):
        print (grid[x][y])

它输出的是这样的:

0 0
(0, 0)
1 0
(1, 0)
2 0
(2, 0)
0 1
(0, 1)
1 1
(1, 1)
2 1
(2, 1)
0 2
(0, 2)
1 2
(1, 2)
2 2
(2, 2)

Testing:
(2, 0)
(2, 0)
(2, 0)
(2, 1)
(2, 1)
(2, 1)
(2, 2)
(2, 2)
(2, 2)

【问题讨论】:

标签: python list tuples


【解决方案1】:

问题是这样的:

for x in range(0,3):
    grid.append(row)

请记住,row 是指代特定列表的名称。通过多次执行这行代码,您将同一个列表多次添加到grid。换句话说,grid[0]grid[1]grid[2] 都指向同一块内存。

因此,当您修改所有三个指向的列表时,所有三个都会显示更改。

为避免这种情况,您需要在插入列表时制作列表的副本,这样您就不会多次插入同一个对象(只是同一个对象的副本)。最简单的方法是制作一个空白切片:

for x in range(0, 3):
    grid.append(row[:])

【讨论】:

  • 啊!我就知道有什么诡计!谢谢!
【解决方案2】:

这是因为元组是可散列的,所以你必须复制这些对象:

for x in range(0, 3):
    grid.append(row.copy())

【讨论】:

  • 元组是不可变的。 Row 是一个列表,列表是可变的。
  • @Accccumulation 对不起,我的意思是可散列的,也是不可变的,这是我的错字
猜你喜欢
  • 2013-09-30
  • 2021-12-07
  • 2018-03-02
  • 2015-04-13
  • 2011-02-24
  • 2013-08-29
  • 2016-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多