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使用递归解决全排列数字示例
Feb 11 Python
Python for Informatics 第11章 正则表达式(一)
Apr 21 Python
Python中的sort()方法使用基础教程
Jan 08 Python
简单实现python数独游戏
Mar 30 Python
pycham查看程序执行的时间方法
Nov 29 Python
简单了解python的break、continue、pass
Jul 08 Python
简单了解python变量的作用域
Jul 30 Python
django 实现celery动态设置周期任务执行时间
Nov 19 Python
基于python及pytorch中乘法的使用详解
Dec 27 Python
pytorch 准备、训练和测试自己的图片数据的方法
Jan 10 Python
pycharm新建Vue项目的方法步骤(图文)
Mar 04 Python
Python3如何使用tabulate打印数据
Sep 25 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
Yii开启片段缓存的方法
2016/03/28 PHP
PHP获取指定日期是星期几的实现方法
2016/11/30 PHP
PHP自带方法验证邮箱、URL、IP是否合法的函数
2016/12/08 PHP
在模板页面的js使用办法
2010/04/01 Javascript
passwordStrength 基于jquery的密码强度检测代码使用介绍
2011/10/08 Javascript
Javascript实现简单的富文本编辑器附演示
2014/06/16 Javascript
原生JS实现《别踩白块》游戏(兼容IE)
2017/02/20 Javascript
Restify中接入Socket.io报Error:Can’t set headers的错误解决
2017/03/28 Javascript
Vue.js 插件开发详解
2017/03/29 Javascript
Vue v2.5 调整和更新不完全问题
2017/10/24 Javascript
关于vue中watch检测到不到对象属性的变化的解决方法
2018/02/08 Javascript
微信小程序实现的canvas合成图片功能示例
2019/05/03 Javascript
mpvue微信小程序的接口请求fly全局拦截代码实例
2019/11/13 Javascript
理解Proxy及使用Proxy实现vue数据双向绑定操作
2020/07/18 Javascript
python生成IP段的方法
2015/07/07 Python
Python中遍历字典过程中更改元素导致异常的解决方法
2016/05/12 Python
解决python 输出是省略号的问题
2018/04/19 Python
Django中使用Whoosh进行全文检索的方法
2019/03/31 Python
python求numpy中array按列非零元素的平均值案例
2020/06/08 Python
Python调用OpenCV实现图像平滑代码实例
2020/06/19 Python
keras.utils.to_categorical和one hot格式解析
2020/07/02 Python
Python Tricks 使用 pywinrm 远程控制 Windows 主机的方法
2020/07/21 Python
HTML5实现直播间评论滚动效果的代码
2020/05/27 HTML / CSS
h5移动端调用支付宝、微信支付的实现
2020/06/08 HTML / CSS
天巡全球:Skyscanner Global
2017/06/20 全球购物
芬兰设计商店美国:Finnish Design Shop US
2019/03/25 全球购物
英国家居用品和家居装饰品购物网站:Cox & Cox
2019/08/25 全球购物
《蒲公英》教学反思
2014/02/28 职场文书
新年寄语大全
2014/04/12 职场文书
学校食堂食品安全责任书
2014/07/28 职场文书
初中生散播谣言检讨书
2014/11/17 职场文书
余世维讲座观后感
2015/06/11 职场文书
信息技术课教学反思
2016/02/23 职场文书
写作技巧:怎样写好一份优秀工作总结?
2019/08/14 职场文书
Python基础之元组与文件知识总结
2021/05/19 Python
mysql查询结果实现多列拼接查询
2022/04/03 MySQL