一、灵活的列表:
#coding=gbk
'''
需求:初始化一个方阵,要求主对角元素相等,主对角线元素为零。
自己想当然地在Python搞个“类C/C++二维数组”,并两层循环地初始化每个元素。
[测试环境]:Python 2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)] on win32
@Author: HuaLingson
@Version: 0.1
'''
#NOTE: 当然存在更优的方法来做,这里的代码仅为说明“类C/C++二维数组”在Python中的不同。
N = 3
target = [[0]*N]*N #特别是对于‘半桶水’的,喜欢玩点儿小技巧的,肯定会这样
print target #[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
for x in range(N):
for y in range(x):
print (x, y), (y, x), x
target[x][y] = target[y][x] = x
print target #[[2, 2, 2], [2, 2, 2], [2, 2, 2]]
#TODO: what is wrong?
'''
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
(1, 0) (0, 1) 1
(2, 0) (0, 2) 2
(2, 1) (1, 2) 2
[[2, 2, 2], [2, 2, 2], [2, 2, 2]]
1 None
2 2
[None, 2, None] 100 [None, 2, None]
'''
#NONE: ‘[[初始值]*N]*N’定义的‘二维列表’X,X[i][j](0<=i<=j<N)直接赋值是影响X的‘第j列’,与行无关。
#NOTE: 想想Java中二维数组的初始化形式~
#NOTE: C/C++是一维模拟二维,Java/Python则是采用类似C/C++中的数组指针数组结构。
x = [[None]*3]*3
x[1][1] = 1
print x[0][1], x[1][0] #1 None
x[0][1] = 2
print x[2][1], x[1][1] #2 2
x[1] = 100
print x[0], x[1], x[2]