【问题标题】:Possible error in Python Array operations modulePython 数组操作模块中可能出现的错误
【发布时间】:2020-03-09 10:23:33
【问题描述】:

在为 Leetcode 问题编写代码 sn-p 时,我注意到我的 Python3 数组没有按预期更新。

基本上,我有一个二维数组,列出了井字游戏的玩家动作。玩家 A 先玩,玩家 B 下,玩家 A 下,依此类推。我的第一步是在二维数组上表示这些移动。下面列出的数组moves 提到了要更新的 3x3 井字棋网格的 (x,y) 坐标。

(0,0)  |  (0,1)  |  (0,2)
_______|_________|________
 (1,0) |  (1,1)  |  (1,2)
       |         |
_______|_________|________
(2,0)  |   (2,1) |  (2,2)
       |         |
moves = [[0,0],[2,0],[1,1],[2,1],[2,2]]
arr=[['']*3]*3
#print(arr)
for i in range(len(moves)):
    xC=moves[i][0]
    yC=moves[i][1]
    if(i%2==0):
        #playerA
        arr[xC][yC]='X'
    else:
        #playerB
        arr[xC][yC]='O'  
print(arr)

变量 'moves' 列出了井字游戏中 9 个盒子中仅 5 个盒子的数量,但输出数组 'arr' 是这样填充的:

[['O', 'O', 'X'], ['O', 'O', 'X'], ['O', 'O', 'X']]

仅供参考:我已经使用 Py3 几年了,我对它很满意(不是新手)。 你对这个问题有什么看法? Py3 的数组模块中的错误?让我知道。 (顺便说一句,我的第一个 StackOverflow 问题!)

问题在这个地址:https://leetcode.com/problems/find-winner-on-a-tic-tac-toe-game/

【问题讨论】:

  • 请更正您的代码。 int 变量 i 不允许下标。
  • 谢谢!我也更新了。

标签: python arrays python-3.x


【解决方案1】:

您的代码的问题在于arr=[['']*3]*3 行。看起来您正在创建三个不同的空字符串列表,但实际上您是在创建 对同一个列表的三个引用 - 这就是 Python 中的列表乘法。当您更改一个列表时,它们都会更改,因为它们都是相同的列表。

如果您将上述行替换为arr = [['']*3 for _ in range(3)],您的代码将按预期运行。这个列表推导实际上会创建三个不相关的列表。请注意,您仍然在每个列表中创建对同一字符串的三个引用,因为仍然使用乘法 - 但这没关系,因为字符串在 python 中是不可变的,所以这并不重要。

【讨论】:

  • 非常感谢@chuck2002!当我用您的方法替换数组实例化时,该程序现在可以工作。如果你不介意,你能指导我一些 Py3 的深入文档/最佳实践指南吗?我希望以后避免这样的陷阱。
  • @AswinTekur 实际上我没有从任何我可以特别推荐的重要资源中学习。根据我的经验,改进的最佳方法是尝试、失败、找到错误并修复它。只要您对某事感到困惑,请继续这样做并谷歌
  • 我试图写一个类似的答案,但不得不去 afk 一段时间:D 不管怎样,看看stackoverflow.com/questions/986006/…,它描述了发生在你的代码。
猜你喜欢
  • 1970-01-01
  • 2014-12-22
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
  • 2014-02-27
  • 2019-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多