python的二维数组操作

本文探讨了Python中创建二维数组时出现的一个常见错误——浅拷贝导致的数据同步修改问题,并提供了一个正确的创建方法。

需要在程序中使用二维数组,网上找到一种这样的用法:

1
2
3
4
5
6
#创建一个宽度为3,高度为4的数组
#[[0,0,0],
# [0,0,0],
# [0,0,0],
# [0,0,0]]
myList =  [[ 0 ] *  3 ] *  4

但是当操作myList[0][1] = 1时,发现整个第二列都被赋值,变成

[[0,1,0],

[0,1,0],

[0,1,0],

[0,1,0]]

为什么...一时搞不懂,后面翻阅The Python Standard Library 找到答案

list * n—>n shallow copies of list concatenated, n个list的浅拷贝的连接

例:

1
2
3
4
5
6
>>> lists =  [[]] *  3
>>> lists
[[], [], []]
>>> lists[ 0 ].append( 3 )
>>> lists
[[ 3 ], [ 3 ], [ 3 ]]

[[]]是一个含有一个空列表元素的列表,所以[[]]*3表示3个指向这个空列表元素的引用,修改任何

一个元素都会改变整个列表:

所以需要用另外一种方式进行创建多维数组,以免浅拷贝:

1
2
3
4
5
6
>>> lists =  [[] for  i in  range ( 3 )]
>>> lists[ 0 ].append( 3 )
>>> lists[ 1 ].append( 5 )
>>> lists[ 2 ].append( 7 )
>>> lists
[[ 3 ], [ 5 ], [ 7 ]]

之前的二维数组创建方式为:

1
myList =  [([ 0 ] *  3 ) for  i in  range ( 4 )]
http://www.cnblogs.com/btchenguang/

Python二维数组是实用的数据结构,用于存储和操作具有行和列的数据,可通过列表的列表轻松创建、添加和遍历[^1]。 ### 创建 - **利用`list`自身构造**:不过这种方法不能构造完全灵活的二维数组,不建议采用[^3]。例如: ```python two_d_array = [[0 for _ in range(3)] for _ in range(2)] print(two_d_array) ``` - **自定义类创建**:可以自定义类来模拟二维数组的功能,如下面的`List2nd`类,它可以创建、输入和输出二维数组元素等操作[^2]。 ```python class List2nd: def __init__(self, l, e, string=''): self.l = l self.a = e self.list = [string] * l * e def inp(self, z, b, string): self.list[(z * self.a + b)] = string def out(self, z, b): return self.list[z * self.a + b] def __get__(self): for i in range(self.l): for j in range(self.a): print(self.list[i * self.a + j], end=' ') print() def printf(self): list_ = [] _list = [] for i in range(self.l): for j in range(self.a): list_.append(self.list[i * self.a + j]) _list.append(list_) list_ = [] return _list # 使用示例 arr = List2nd(2, 3) arr.inp(0, 0, 'a') print(arr.out(0, 0)) ``` ### 操作 - **添加元素**:可以通过列表的方法向二维数组中添加元素。例如,向二维数组的某一行添加元素: ```python two_d_array = [[1, 2], [3, 4]] two_d_array[0].append(5) print(two_d_array) ``` - **遍历数组**:可以使用嵌套循环来遍历二维数组中的每个元素。 ```python two_d_array = [[1, 2], [3, 4]] for row in two_d_array: for element in row: print(element) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值