【问题标题】:Python range is printed twicePython范围打印两次
【发布时间】:2021-03-29 08:19:12
【问题描述】:

我目前正在开发一个项目(在 Python 2.7 中),当 range()for 值被打印两次时遇到了问题。 我最小化了很多我正在谈论的部分,所以如果只是假设我的代码中还有其他部分。

所以,基本上,我有一个 5 x 5 的板,根据 case1case2,我正在复制带有 list() 的板并对其进行更改。然后,我想要一列数字说明行号,这样输出将类似于:

1     O O O O O
2     O O O O O
3     O O O O O
4     O O O O O
5     O O O O O

对于case1case2

我有:

board = []
# Creating board
for i in range(5):
  board.append(["O"] * 5) 
case1 = True
case2 = True

if case1 == True:
  board1 = list(board) #Making duplicate of board
  # I took out a lot of the code making alterations to board1
  
  for i in range(5):
    board1[i].insert(0, str(i + 1) + "    ")

if case2 == True:
  board2 = list(board) #Making duplicate of board
  # I took out a lot of the code making alterations to board2
  
  for i in range(5):
    board2[i].insert(0, str(i + 1) + "    ")

#Printing the boards
for i in range(5):
  print " ".join(board1[i])

print "\n\n" #Just a gap

for i in range(5):
  print " ".join(board2[i])

但是,输出是:

1     1     O O O O O
2     2     O O O O O
3     3     O O O O O
4     4     O O O O O
5     5     O O O O O

对于每个 board1board2。当我取出与case2 相关的所有内容时,我得到了预期的结果,但是,使用我当前的代码,它正在为打印两次的行打印 range()。

我想知道有没有办法解决这个问题。

对不起,如果我的措辞很不清楚。如果有人为了更清楚而编辑问题/标题,我将不胜感激。

【问题讨论】:

  • board2 = list(board) 确实创建一个副本,它的子列表仍然是来自board 的列表的引用,所以你对board1board2 所做的任何事情正在影响所有 3 个板。请参阅:stackoverflow.com/questions/2541865/… 如果你解决了这个问题,你还有问题吗?

标签: python list for-loop range python-2.x


【解决方案1】:

正如@Random Davis 指出的那样,问题出在您复制列表列表以创建 board1 和 board2 的事实。

board1=list(board)
board2=list(board)

这样,当你将值 1-5 插入到 board1 时,它们也会被插入到 board2 中,因为它们仍然是对 board 的引用,因此当你在 board2 中插入值时,它们会被第二次插入。

为避免这种情况,您必须按如下方式创建 board1、board2:

board1=[list(i) for i in board]
board2=[list(i) for i in board]

一切都会正常进行

在这里查看为什么对 board1 的更改会反映到 board2:

Copying nested lists in Python

List changes unexpectedly after assignment. How do I clone or copy it to prevent this?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    相关资源
    最近更新 更多