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获取Linux系统下的本机IP地址代码分享
Nov 07 Python
安装ElasticSearch搜索工具并配置Python驱动的方法
Dec 22 Python
使用Python的Scrapy框架十分钟爬取美女图
Dec 26 Python
详细解读tornado协程(coroutine)原理
Jan 15 Python
解决Python下imread,imwrite不支持中文的问题
Dec 05 Python
理想高通滤波实现Python opencv示例
Jan 30 Python
关于Python作用域自学总结
Jun 10 Python
解决python flask中config配置管理的问题
Jul 26 Python
Python中字典与恒等运算符的用法分析
Aug 22 Python
TensorFlow的reshape操作 tf.reshape的实现
Apr 19 Python
python调用API接口实现登陆短信验证
May 10 Python
使用pytorch实现线性回归
Apr 11 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实现水仙花数示例分享
2014/04/03 PHP
php创建桌面快捷方式实现方法
2015/12/31 PHP
jQuery对表单元素的取值和赋值操作代码
2011/05/19 Javascript
关于JS中的闭包浅谈
2013/08/23 Javascript
jquery选择器、属性设置用法经验总结
2013/09/08 Javascript
Javascript中的几种URL编码方法比较
2015/01/23 Javascript
jquery滚动特效集锦
2015/06/03 Javascript
JS实现的表格行鼠标点击高亮效果代码
2015/11/27 Javascript
AngularJs Scope详解及示例代码
2016/09/01 Javascript
JS正则RegExp.test()使用注意事项(不具有重复性)
2016/12/28 Javascript
AngularJS的脏检查深入分析
2017/04/22 Javascript
js+html5实现页面可刷新的倒计时效果
2017/07/15 Javascript
jQuery实现的电子时钟效果完整示例
2018/04/28 jQuery
JavaScript实现图片的放大缩小及拖拽功能示例
2019/05/14 Javascript
Vue中fragment.js使用方法小结
2020/02/17 Javascript
详解Typescript 内置的模块导入兼容方式
2020/05/31 Javascript
vuex的数据渲染与修改浅析
2020/11/26 Vue.js
[47:55]Ti4第二日主赛事败者组 NaVi vs EG 1
2014/07/20 DOTA
Python基于PycURL实现POST的方法
2015/07/25 Python
详谈python read readline readlines的区别
2017/09/22 Python
python 限制函数调用次数的实例讲解
2018/04/21 Python
儿童python练习实例
2018/05/27 Python
Python面向对象总结及类与正则表达式详解
2019/04/18 Python
python3的print()函数的用法图文讲解
2019/07/16 Python
解决Django加载静态资源失败的问题
2019/07/28 Python
python实现输入任意一个大写字母生成金字塔的示例
2019/10/27 Python
TensorFlow Saver:保存和读取模型参数.ckpt实例
2020/02/10 Python
python 使用递归的方式实现语义图片分割功能
2020/07/16 Python
英国DIY和家居装饰领域的主要品牌:Wickes
2019/11/26 全球购物
Timberland俄罗斯官方网上商店:全球领先的户外品牌
2020/03/15 全球购物
自我评价是什么
2014/01/04 职场文书
大学生职业规划范文:象牙塔生活的四年计划
2014/01/14 职场文书
生物学学生自我评价
2014/01/17 职场文书
物理系毕业生自荐书范文
2014/02/22 职场文书
施工安全保证书
2015/05/09 职场文书
Python如何加载模型并查看网络
2022/07/15 Python