python学习之路(五)
一,嵌套列表的遍历
上图是对列表遍历的代码,for i in matrix :是对列表中嵌套的数组进行遍历。for each in i是对数组的遍历。由此便可以对整个列表进行遍历。我们来看最后两行代码,print (each , end = " "),这串代码是指输出一个字符,然后输出一个空格。默认情况下,print是输出之后直接换行的,相当于print ( each , end = "/n"),这里让end等于空格,是其不会换行,然后在后边用print()进行换行,从而达到输出一个数组换一行的效果。
如果需要单独访问,其中的某个元素,方法和C语言中访问二维数组的方法是一样的。
那么,我们再来看看如何生成一个二位数组
我们可以先生成一个数组,然后通过对for和range循环使用,将这个数组作为元素,生成二维数组。那么,就会有一个问题,我们既然可以通过[0]*3来生成一个元素全部为0的数组,那我们是不是也可以用同样的方法生成一个二维数组,实际操作一下发现确实是可以的,但是实际上是不行的,这是一个不易被察觉的错误,为了说明这错误,我们引入一下is运算符。
在 Python 中,is
是一个身份运算符(identity operator),它比较的是两个对象在内存中的地址是否相同。
看上面这串代码我们可以发现,两个看上去一样的东西,通过is运算符进行判断时,他的结果是不一样的,这说明不同的东西在python中的存储方式是不同的。字符串是不变的,所以python只会为其开辟一个空间,而列表是会变化的,python不清楚用户什么时候会对列表的元素进行增删改查的操作,所以python会给x和y分配不同的空间,所以他们的地址是不同的。
当我们使用这一方法,来判断上面我们说的那个错误
我们发现第一行的第二个元素和第二行的第二个元素的地址是一样的,第二行和第三行的地址是一样的,也就是说python在存储时,将这三个东西存在了同一个地方。
二,浅拷贝与深拷贝
上述这两种属于浅拷贝,可以通过copy和切片来完成。拷贝后对其中一个进行操作并不会对另一个产生影响,但是这毕竟是浅拷贝,面对二维时就会产生问题。
我们对其中一个进行操作时,会对另一个产生影响。为了解决这一问题,我们会用到深拷贝。
深拷贝我们用到了deepcopy这个玩意,使用这个东西时,我们需要把 Python 标准库中的 copy
模块引入当前文件,然后就可以使用深拷贝了。由于深拷贝(deep copy)是一次性递归地复制一个对象及其内部所有层级的嵌套对象,从而得到一个完全独立、与原对象互不干扰的新对象。所以,对他们进行操作时,他们相互之间是不会产生影响的。