前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python初始化二维数组的两种方式及区别

python初始化二维数组的两种方式及区别

原创
作者头像
qnner
发布2022-08-09 23:40:07
6080
发布2022-08-09 23:40:07
举报
文章被收录于专栏:qnner的文章

最近写代码的时候,发现一个比较好玩的事情。

背景是这样的:

初始化一个a*b二维数组的二维数组

第一种写法:

我最开始的写法是这样的:

代码语言:javascript
复制
arr = [[0]*3] * 3

在尝试给其中某个元素赋值的时候,发现同一列的其他元素也会变成一样的值,大概就像这样:

代码语言:javascript
复制
print(arr)
print("-------")
arr[1][1] = 3
print(arr)

""" 输出:
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
-------
[[0, 3, 0], [0, 3, 0], [0, 3, 0]]
"""

是不是很神奇?

尝试定位,猜测这个二维数组的每个子数组引用了同一个对象。

打印id看下:

代码语言:javascript
复制
print(id(arr[0]))
print(id(arr[1]))
print(id(arr[2]))

""" 输出:
4303451584
4303451584
4303451584
"""

果然,他们的内存地址都是一样的

第二种写法:

代码语言:javascript
复制
arr = [[0]*3 for i in range(3)]

print(arr)
print("-------")
arr[1][1] = 3
print(arr)

print(id(arr[0]))
print(id(arr[1]))
print(id(arr[2]))

""" 输出:
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
-------
[[0, 0, 0], [0, 3, 0], [0, 0, 0]]
4378010048
4378009984
4378009856
"""

可以看见,尝试修改[1][1]的值,[0][1], [2][1]的值并没有被改变,且每个子数组的内存地址不一样

两种写法的对象是否相等?

尝试判断下两种写法生成的对象,直接比较是否相等

代码语言:javascript
复制
arr1 = [[0]*3 for i in range(3)]
arr2 = [[0]*3] * 3

print("原始状态是否一致: ", arr1 == arr2)

arr1[1][1] = 1
arr2[1][1] = 1
print(arr1 == arr2)
print("修改[1][1]后是否一致: ", arr1 == arr2)


""" 输出:
原始状态是否一致:  True
False
修改[1][1]后是否一致:  False
"""

可以看见,在未修改值之前,两个数组比较是相等的;

尝试修改[1][1]后,两个数组再次比较变得不再相等。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第一种写法:
  • 第二种写法:
  • 两种写法的对象是否相等?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档