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外星人入侵游戏编程完整版
Mar 30 Python
利用python微信库itchat实现微信自动回复功能
May 18 Python
Anaconda多环境多版本python配置操作方法
Sep 12 Python
python中如何使用正则表达式的非贪婪模式示例
Oct 09 Python
Python实现的读写json文件功能示例
Jun 05 Python
解决安装pyqt5之后无法打开spyder的问题
Dec 13 Python
Python 解码Base64 得到码流格式文本实例
Jan 09 Python
使用遗传算法求二元函数的最小值
Feb 11 Python
Python3.6 + TensorFlow 安装配置图文教程(Windows 64 bit)
Feb 24 Python
如何在keras中添加自己的优化器(如adam等)
Jun 19 Python
python实现感知机模型的示例
Sep 30 Python
Python 处理表格进行成绩排序的操作代码
Jul 26 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
WINDOWS 2000下使用ISAPI方式安装PHP
2006/09/05 PHP
smarty缓存用法分析
2014/12/16 PHP
分享php分页的功能模块
2015/06/16 PHP
php简单实现批量上传图片的方法
2016/05/09 PHP
php使用file函数、fseek函数读取大文件效率对比分析
2016/11/04 PHP
PHP7新特性之抽象语法树(AST)带来的变化详解
2018/07/17 PHP
推荐11款jQuery开发的复选框和单选框美化插件
2011/08/02 Javascript
createElement与createDocumentFragment的点点区别小结
2011/12/19 Javascript
Javascript Throttle & Debounce应用介绍
2013/03/19 Javascript
关于ExtJS4.1:快捷键支持的问题
2013/04/24 Javascript
jquery showModelDialog的使用方法示例详解
2013/11/19 Javascript
JavaScript 表单处理实现代码
2015/04/13 Javascript
JS实现文字掉落效果的方法
2015/05/06 Javascript
使用watch监听路由变化和watch监听对象的实例
2018/02/24 Javascript
JS实现显示当前日期的实例代码
2018/07/03 Javascript
layui实现table加载的示例代码
2018/08/14 Javascript
使用layui监听器监听select下拉框,事件绑定不成功的解决方法
2019/09/28 Javascript
javascript中正则表达式语法详解
2020/08/07 Javascript
Python两个整数相除得到浮点数值的方法
2015/03/18 Python
简单介绍Python中的len()函数的使用
2015/04/07 Python
Python开发之快速搭建自动回复微信公众号功能
2016/04/22 Python
python字典DICT类型合并详解
2017/08/17 Python
Python 3.7新功能之dataclass装饰器详解
2018/04/21 Python
python去除扩展名的实例讲解
2018/04/23 Python
python实现飞机大战
2018/09/11 Python
python中pika模块问题的深入探究
2018/10/13 Python
python关闭占用端口方式
2019/12/17 Python
安装多个版本的TensorFlow的方法步骤
2020/04/21 Python
iframe与window.onload如何使用详解
2020/05/07 HTML / CSS
玉兰油美国官网:OLAY美国
2018/10/25 全球购物
意大利消费电子产品购物网站:SLG Store
2019/12/26 全球购物
三年级学生评语
2014/04/23 职场文书
学校地质灾害防治方案
2014/06/10 职场文书
佛光寺导游词
2015/02/10 职场文书
一次SQL如何查重及去重的实战记录
2022/03/13 MySQL
Windows10安装Apache2.4的方法步骤
2022/06/25 Servers