Python数组操作模块中可能存在错误

Python数组操作模块中可能存在错误,python,arrays,python-3.x,Python,Arrays,Python 3.x,在为Leetcode问题编写代码片段时,我注意到我的Python3阵列没有得到预期的更新 基本上,我有一个2D数组,列出了一个tic tac toe游戏中玩家的动作。玩家A先玩,玩家B下一个,玩家A下一个,依此类推。我的第一步是在2D数组中表示这些移动。下面列出的阵列移动提到了要更新的3x3 Tictaoe网格的x、y坐标 (0,0) | (0,1) | (0,2) _______|_________|________ (1,0) | (1,1) | (1,2) |

在为Leetcode问题编写代码片段时,我注意到我的Python3阵列没有得到预期的更新

基本上,我有一个2D数组,列出了一个tic tac toe游戏中玩家的动作。玩家A先玩,玩家B下一个,玩家A下一个,依此类推。我的第一步是在2D数组中表示这些移动。下面列出的阵列移动提到了要更新的3x3 Tictaoe网格的x、y坐标

(0,0)  |  (0,1)  |  (0,2)
_______|_________|________
 (1,0) |  (1,1)  |  (1,2)
       |         |
_______|_________|________
(2,0)  |   (2,1) |  (2,2)
       |         |
变量“moves”只列出了tic-tac-toe游戏中9个盒子中的5个盒子的填充,但输出数组“arr”填充如下:

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

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


问题在这个地址:

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


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

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


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

请更正您的代码。int变量我不允许订阅。谢谢!我已经更新了。请更正您的代码。int变量我不允许订阅。谢谢!我已经更新了。非常感谢@chuck2002!现在,当我用您的方法替换数组实例化时,程序就可以运行了。如果您不介意的话,您能给我介绍一些Py3的深入文档/最佳实践指南吗?我希望以后能避免这样的陷阱。@AswinTekur我实际上没有从任何我可以特别推荐的好资源中学习。根据我的经验,最好的改进方法是尝试,失败,找到错误并修复它。只要继续这样做,当你对某些事情感到困惑时,谷歌就会这样做。我正试图写一个类似的答案,但不得不犹豫一段时间:D不管是哪种方式,请看一看,它描述了代码中发生的一些可变/不可变问题。非常感谢@chuck2002!现在,当我用您的方法替换数组实例化时,程序就可以运行了。如果您不介意的话,您能给我介绍一些Py3的深入文档/最佳实践指南吗?我希望以后能避免这样的陷阱。@AswinTekur我实际上没有从任何我可以特别推荐的好资源中学习。根据我的经验,最好的改进方法是尝试,失败,找到错误并修复它。只要继续这样做,每当你对某件事感到困惑时,谷歌就会这样做。我试图写一个类似的答案,但不得不犹豫一段时间:D不管是哪种方式,请看一下,它描述了代码中发生的一些可变性/不变性问题。
[['O', 'O', 'X'], ['O', 'O', 'X'], ['O', 'O', 'X']]