Python 多维List创建的问题小结

背景

最近在学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 *这个运算符不够了解,因此想当然觉得代表了对对象进行深拷贝。而且可能前端做多了,对数据结构这种基础不太敏感了吧,还是要多做练习啊。

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

(0)

相关推荐

  • Python列表list排列组合操作示例

    本文实例讲述了Python列表list排列组合操作.分享给大家供大家参考,具体如下: 排列 例如: 输入为 ['1','2','3']和3 输出为 ['111','112','113','121','122','123','131','132','133','211','212','213','221','222','223','231','232','233','311','312','313','321','322','323','331','332','333'] 实现代码: # -*-

  • Python List cmp()知识点总结

    描述 cmp() 方法用于比较两个列表的元素. 语法 cmp()方法语法: cmp(list1, list2) 参数 list1 -- 比较的列表. list2 -- 比较的列表. 返回值 如果比较的元素是同类型的,则比较其值,返回结果. 如果两个元素不是同一种类型,则检查它们是否是数字. 如果是数字,执行必要的数字强制类型转换,然后比较. 如果有一方的元素是数字,则另一方的元素"大"(数字是"最小的") 否则,通过类型名字的字母顺序进行比较. 如果有一个列表首先到

  • Python list列表中删除多个重复元素操作示例

    本文实例讲述了Python list列表中删除多个重复元素操作.分享给大家供大家参考,具体如下: 我们以下面这个list为例,删除其中所有值为6的元素: l=[9,6,5,6,6,7,8,9,6,0] 首先尝试remove方法: l.remove(6) print(l) 结果为:[9, 5, 6, 6, 7, 8, 9, 6, 0],只删除了第一个为6的元素. 如果采用for循环遍历各元素: for x in l: if x == 6: l.remove(x) 结果为[9, 5, 7, 8, 9

  • 在python中以相同顺序shuffle两个list的方法

    通常做机器学习问题时,需要准备训练数据,通常会把样本数据和标签存放于2个list中,比如train_x = [x1,x2,...,xN][x1,x2,...,xN],train_y = [y1,y2,...,yN][y1,y2,...,yN]. 有时候是需要将数据shuffle后再做处理的(比如,批量梯度下降算法,需要数据是打乱的). 这时就需要以相同的顺序打乱两个list,那么在python中如何实现呢?可以通过设置相同的随机种子,再shuffle的方式来实现. 代码如下: import ra

  • 详解python中list的使用

    1.list(列表)是一种有序的集合,可以随时添加.修改.删除其中的元素. 举例:listClassName = ['Jack','Tom','Mark'] 列表可以根据索引获取元素,如:listClassName[0] : 列表索引是从0开始的,最后一个元素索引是len(listClassName)-1: 如果要取最后一个元素,除了计算索引位置外,还可以用-1做索引,直接获取最后一个元素: 1.1 获取列表个数(长度):用len()函数,可以获取列表元素的个数(元素从1开始计算的):len(l

  • Python判断一个list中是否包含另一个list全部元素的方法分析

    本文实例讲述了Python判断一个list中是否包含另一个list全部元素的方法.分享给大家供大家参考,具体如下: 你可以用for in循环+in来判断 #!/usr/bin/env python # coding: utf-8 a = [1, 2, 3, 4, 5] b = [3, 4, 5] d = [False for c in b if c not in a] if d: print "a不包含b的所有元素" else: print "a包含b的所有元素"

  • Python 多维List创建的问题小结

    背景 最近在学Python,我觉得学习一个新语言最好的方式就是写一个简单的项目,所以就打算写一个简单的俄罗斯方块游戏.那么在写的过程中遇到了一个小问题. def __init__(self, width = 10, height = 30): self.width, self.height = width, height self.board_size = [width, height] 我用一个二维List来记录游戏空间的状态,game_boardx代表一个格子,0代表这格子是空的,1代表不是

  • Python 实现使用dict 创建二维数据、DataFrame

    Python 实现使用 dict 创建二维数据 dict 的 keys.values 分别作为二维数据的两列 In [16]: d = {1:'aa', 2:'bb', 3:'cc'} In [17]: arr = list(d.items()) # 关键的一步 In [18]: narr = np.array(arr) In [19]: narr Out[19]: array([['1', 'aa'], ['2', 'bb'], ['3', 'cc']], dtype='<U11') Pyth

  • Python利用myqr库创建自己的二维码

    前言 相信朋友们都看过各种群里钓鱼的涩图二维码吧(手动滑稽),今天学了一下制作方式(myqr库的使用),在这里分享一下这个整活利器. MyQR是一个能够生成自定义二维码的第三方库,可以根据需要生成普通二维码.带图片的艺术二维码,也可以生成动态二维码 首先配置好python3的环境(也可以用anaconda)和编译器(我用的pycharm). pip安装一下myqr库: pip install myqr pycharm中新建项目新建文件后 from MyQR import myqr myqr.ru

  • Python二维列表的创建、转换以及访问详解

    目录 一.概念 二.创建二维列表 1.追加一维列标来生成二维列标 2.直接赋值生成二维列表 三.一维列标与二维列表的转换 1.一维列表转换成二维列表 2.二维列表转换成一维列表 3.利用NumPy实现数组的变维操作 四.访问二维列表 1.访问行 2.访问元素 3.NumPy二维数组的访问 补充:二维列表的实战应用 总结 一.概念 二维列表的元素还是列表(列表的嵌套),称之为二维列表. 需要通过行标和列标来访问二维列表的元素 二.创建二维列表 1.追加一维列标来生成二维列标 生成一个4行3列的二维

  • 基于python 二维数组及画图的实例详解

    1.二维数组取值 注:不管是二维数组,还是一维数组,数组里的数据类型要一模一样,即若是数值型,全为数值型 #二维数组 import numpy as np list1=[[1.73,1.68,1.71,1.89,1.78], [54.4,59.2,63.6,88.4,68.7]] list3=[1.73,1.68,1.71,1.89,1.78] list4=[54.4,59.2,63.6,88.4,68.7] list5=np.array([1.73,1.68,1.71,1.89,1.78])

  • python 实现目录复制的三种小结

    复制目录: 包含多层子目录 方法: 递归, 深度遍历,广度遍历 深度遍历&广度遍历: 思路: 1.获得源目录子级目录,并设置目标目录的子级路径 1.1在此就创建两个栈(或者队列),将原目录和目标目录分别添加到栈(或者队列)里面,一般用append添加,加在栈的顶部,队列的后部 1.2深度遍历 从栈的顶部取出一个原路径去判断,同时用同样的方式取出目标路径(栈和队列都类似于list,都可以用list实现) 广度遍历 从队列的前面取出一个原路径去判断,同时用同样的方式取出目标路径 2.判断原子级路径是

  • Python 脚本的三种执行方式小结

    1.交互模式下执行 Python,这种模式下,无需创建脚本文件,直接在 Python解释器的交互模式下编写对应的 Python 语句即可. 1)打开交互模式的方式: Windows下: 在开始菜单找到"命令提示符",打开,就进入到命令行模式: 在命令行模式输入: python 即可进入 Python 的交互模式 Linux 下: 直接在终端输入 python,如果是按装了 python3 ,则根据自己建的软连接的名字进入对应版本的 Python 交互环境,例如我建立软连接使用的 pyt

  • 将不规则的Python多维数组拉平到一维的方法实现

    原始需求: 例如有一个列表: l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 希望把它转换成下面这种形式: [1, 2, 3, 4, 5, 6, 7, 8, 9] 其实这个非常简单,我将分享三个一行式代码来解决这个问题. 但如果是下面这种不规则的多维列表: l = [[1, 2], [3, 4], [5, [6, 7, [8, 9]]], 10, [11, [12, 13, [14, 15, [16]]]]] 我们想将它拉平到一维列表: [1, 2, 3, 4, 5,

  • python如何用matplotlib创建三维图表

    Matplotlib 最开始被设计为仅支持二维的图表.到 1.0 版本发布左右,一些三维图表的工具在二维展示的基础上被创建了出来,结果就是 Matplotlib 提供了一个方便的(同时也是有限的)的可用于三维数据可视化的一套工具.三维图表可以使用载入mplot3d工具包来激活,这个包会随着 Matplotlib 自动安装: from mpl_toolkits import mplot3d 一旦模块被导入,三维 axes 就可以像其他普通 axes 一样通过关键字参数projection='3d'

  • Python中re模块的元字符使用小结

    目录 类别1:匹配单个字符的元字符 方括号( [] ) 字符集 点 ( . ) 通配符 \w 和 \W 单词字符匹配 \d 和 \D 字符十进制数字匹配 \s 和 \S 字符空格匹配 混合使用 \w, \W, \d, \D, \s, 和\S 类别2:转义元字符 反斜杠 ( \ ) 转义元字符 类别3:锚点 $ 和\Z 字符串的结尾匹配项 \b 和 \B 单词匹配 类别4:量词 * 匹配前面的子表达式零次或多次 + 匹配前面的子表达式一次或多次 ? 匹配前面的子表达式零次或一次 .*?.+?.??

随机推荐