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中 Lambda表达式全面解析
Nov 28 Python
从零开始学Python第八周:详解网络编程基础(socket)
Dec 14 Python
Python简单的制作图片验证码实例
May 31 Python
Python实现抓取HTML网页并以PDF文件形式保存的方法
May 08 Python
pyspark 读取csv文件创建DataFrame的两种方法
Jun 07 Python
Python global全局变量函数详解
Sep 18 Python
python+ffmpeg批量去视频开头的方法
Jan 09 Python
selenium+python自动化测试之多窗口切换
Jan 23 Python
Django通过json格式收集主机信息
May 29 Python
Python-openCV开运算实例
Jul 05 Python
python中pycryto实现数据加密
Apr 29 Python
详解OpenCV曝光融合
Apr 29 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中的(伪)多线程与多进程
2013/07/01 PHP
PHP时间类完整实例(非常实用)
2015/12/25 PHP
php封装的数据库函数与用法示例【参考thinkPHP】
2016/11/08 PHP
实现局部遮罩与关闭原理及代码
2013/02/04 Javascript
jquery文字上下滚动的实现方法
2013/03/22 Javascript
完美兼容各大浏览器的jQuery插件实现图片切换特效
2014/12/12 Javascript
JavaScript 性能优化小结
2015/10/12 Javascript
浅析Javascript匿名函数与自执行函数
2016/02/06 Javascript
基于jquery实现无限级树形菜单
2016/03/22 Javascript
Web开发中客户端的跳转与服务器端的跳转的区别
2017/03/05 Javascript
BootStrap+Mybatis框架下实现表单提交数据重复验证
2017/03/23 Javascript
详解vue-cli项目中的proxyTable跨域问题小结
2018/02/09 Javascript
微信小程序网络封装(简单高效)
2018/08/06 Javascript
layer.open 按钮的点击事件关闭方法
2018/08/17 Javascript
详解JS实现简单的时分秒倒计时代码
2019/04/25 Javascript
Vue基于localStorage存储信息代码实例
2020/11/16 Javascript
在Django中进行用户注册和邮箱验证的方法
2016/05/09 Python
python:socket传输大文件示例
2017/01/18 Python
Python判断两个对象相等的原理
2017/12/12 Python
Python数据分析库pandas基本操作方法
2018/04/08 Python
Python中最好用的命令行参数解析工具(argparse)
2019/08/23 Python
基于python3生成标签云代码解析
2020/02/18 Python
python 使用xlsxwriter循环向excel中插入数据和图片的操作
2021/01/01 Python
Python实现京东抢秒杀功能
2021/01/25 Python
深入解读CSS3中transform变换模型的渲染
2016/05/27 HTML / CSS
HTML5自定义属性的问题分析
2019/08/16 HTML / CSS
小学教师管理制度
2014/01/18 职场文书
教学实验楼管理制度
2014/02/01 职场文书
物业公司的岗位任命书
2014/06/06 职场文书
公司领导班子对照材料
2014/08/18 职场文书
贷款担保书
2015/01/20 职场文书
幼儿园辞职信范文
2015/02/27 职场文书
财务稽核岗位职责
2015/04/13 职场文书
病假条格式范文
2015/08/17 职场文书
2017元旦、春节期间廉洁自律承诺书
2016/03/25 职场文书
新手,如何业余时间安排好写作、提高写作能力?
2019/10/21 职场文书