Python 多维List创建的问题小结


Posted in Python onJanuary 18, 2019

背景

最近在学Python,我觉得学习一个新语言最好的方式就是写一个简单的项目,所以就打算写一个简单的俄罗斯方块游戏。那么在写的过程中遇到了一个小问题。

def __init__(self, width = 10, height = 30):
  self.width, self.height = width, height
  self.board_size = [width, height]

我用一个二维List来记录游戏空间的状态,game_boardx代表一个格子,0代表这格子是空的,1代表不是。很显然,初始化的时候应该将所有的格子都赋值为0。查询了一下List的相关文档,发现可以用[0] * n这样的方式来快速创建特定长度的List,因此很自然的写出了下面这行代码。

self.game_board = [[0] * height] * width

查看一下结果,确实创建了长宽符合预期、值全部都是0的一个二维List,感觉没什么问题,就接着往下写了。

问题

但这两天在写消除方法的时候,使用最下面3排全是1,第四排中间是1其他全是0,这样消除完成之后应该还剩1个1掉落到第一排。但测试过程中发现无论如何都会导致所有的1都被消除了,一开始我还以为是消除的算法有问题,但后来在每一步过程中都监控整个game_board的状态时才发现,当一横排有一个值为1的时候,这一横排所有值都自动变成1了。

解决

很自然的就想到,这是由于List对象的引用产生的。[0] * height产生了长度为height并且内容全是0的List,由于0是个int,是基础数据类型,因此这样使用是正确的。但用这个List去进行* width操作时,产生的都是这个List的引用,而不是新建了width个List,所以修改其中任意一个就全部都修改了。

经过查阅Python文档,将代码修改为:

self.game_board = [([0] * height) for i in range(width)]

测试发现问题解决。

创建二维数组的办法

直接创建法

test = [0, 0, 0], [0, 0, 0], [0, 0, 0]]

简单粗暴,不过太麻烦,一般不用。

列表生成式法

test = [[0 for i in range(m)] for j in range(n)]

学会使用列表生成式,终生受益。

使用模块numpy创建

import numpy as np
test = np.zeros((m, n), dtype=np.int)

总结

其实是很基础的问题,对于Python *这个运算符不够了解,因此想当然觉得代表了对对象进行深拷贝。而且可能前端做多了,对数据结构这种基础不太敏感了吧,还是要多做练习啊。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中from module import * 的一个坑
Jul 20 Python
深入理解python中的atexit模块
Mar 07 Python
tensorflow 加载部分变量的实例讲解
Jul 27 Python
实例分析python3实现并发访问水平切分表
Sep 29 Python
Python拼接字符串的7种方法总结
Nov 01 Python
基于numpy中数组元素的切片复制方法
Nov 15 Python
Python shelve模块实现解析
Aug 28 Python
python如何求数组连续最大和的示例代码
Feb 04 Python
python调用HEG工具批量处理MODIS数据的方法及注意事项
Feb 18 Python
Python类和实例的属性机制原理详解
Mar 21 Python
使用Python实现将多表分批次从数据库导出到Excel
May 15 Python
基于Python绘制个人足迹地图
Jun 01 Python
python感知机实现代码
Jan 18 #Python
python实现感知器算法(批处理)
Jan 18 #Python
python实现多层感知器
Jan 18 #Python
python实现多层感知器MLP(基于双月数据集)
Jan 18 #Python
基于python实现KNN分类算法
Apr 23 #Python
python实现定时发送qq消息
Jan 18 #Python
如何在Django中设置定时任务的方法示例
Jan 18 #Python
You might like
PHP实现采集中国天气网未来7天天气
2014/10/15 PHP
PHP获取ttf格式文件字体名的方法示例
2019/03/06 PHP
laravel 模型查询按照whereIn排序的示例
2019/10/16 PHP
PHP实现创建一个RPC服务操作示例
2020/02/23 PHP
实测jquery data()如何存值
2013/08/18 Javascript
浅析基于WEB前端页面的页面内容搜索的实现思路
2014/06/10 Javascript
JQuery设置时间段下拉选择实例
2014/12/30 Javascript
jQuery中removeClass()方法用法实例
2015/01/05 Javascript
比较常见的javascript中定义函数的区别
2015/11/09 Javascript
javascript事件委托的用法及其好处简析
2016/04/04 Javascript
微信小程序methods中定义的方法互相调用的实例代码
2018/08/07 Javascript
浅谈webpack4.x 入门(一篇足矣)
2018/09/05 Javascript
Angular4.x Event (DOM事件和自定义事件详解)
2018/10/09 Javascript
vue发送websocket请求和http post请求的实例代码
2019/07/11 Javascript
Javascript Symbol原理及使用方法解析
2020/10/22 Javascript
[40:53]完美世界DOTA2联赛PWL S3 Magma vs DLG 第二场 12.18
2020/12/20 DOTA
Linux下编译安装MySQL-Python教程
2015/02/02 Python
Python编程入门的一些基本知识
2015/05/13 Python
python生成器表达式和列表解析
2016/03/10 Python
tensorflow实现对图片的读取的示例代码
2018/02/12 Python
使用Numpy读取CSV文件,并进行行列删除的操作方法
2018/07/04 Python
python使用writerows写csv文件产生多余空行的处理方法
2019/08/01 Python
Python命令行参数解析工具 docopt 安装和应用过程详解
2019/09/26 Python
CSS3实现银灰色动画效果的导航菜单代码
2015/09/01 HTML / CSS
HTML5 audio标签使用js进行播放控制实例
2015/04/24 HTML / CSS
Boom手表官网:瑞典手表品牌,设计你的手表
2019/03/11 全球购物
机械专业应届生求职信
2013/12/12 职场文书
销售经理岗位职责
2014/03/16 职场文书
市场开发与营销专业求职信范文
2014/05/01 职场文书
舞蹈兴趣小组活动总结
2014/07/07 职场文书
经典演讲稿开场白
2014/08/25 职场文书
房地产销售助理岗位职责
2015/04/14 职场文书
2015年教师师德师风承诺书
2015/04/28 职场文书
Javascript 解构赋值详情
2021/11/17 Javascript
navicat 连接Ubuntu虚拟机的mysql的操作方法
2022/04/02 MySQL
springboot读取resources下文件的方式详解
2022/06/21 Java/Android