鱼C论坛

 找回密码
 立即注册
查看: 1354|回复: 7

[已解决]关于python二维列表生成的求助

[复制链接]
发表于 2021-9-12 22:04:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
求助大神,为啥用第二种方法生成的二维列表会报错
第一种:
>>> A=[]
>>> for i in range(3):
        A.append([])
        for j in range(3):
                A[i].append(random.randint(0,3))

                
>>> A
[[1, 0, 3], [2, 1, 0], [3, 1, 0]]
第二种:
>>> A=[0]*3
>>> for i in range(3):
        for j in range(3):
                A[i].append(random.randint(0,3))

                
Traceback (most recent call last):
  File "<pyshell#25>", line 3, in <module>
    A[i].append(random.randint(0,3))
AttributeError: 'int' object has no attribute 'append'

感激不尽~~~
最佳答案
2021-9-13 09:08:48
本帖最后由 洛阳城 于 2021-9-13 09:11 编辑

[0]*3得到的是[0, 0, 0]
因此
type(A[i])
是int,而int类型是不能调用append函数的
你仔细观察第一种方法中的第3句
A.append([])
所以这里的
type(A[i])
是list,是可以调用append的哦
这里想要达到你的效果只需要把
A=[0]*3
改成
A=[[]]*3
即可
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-12 22:16:34 | 显示全部楼层
import random

A = [0]*3 # 這裡意思就是 A = [0, 0, 0] 不是 A = [[0], [0], [0]]
for i in range(3):
    for j in range(3):
        A[i].append(random.randint(0, 3)) # 所以當然這裡也不能正常執行代碼
正確寫法:
A = [[0 for _ in range(3)] for _ in range(3)] # 這裡意思就是 A = [[0, 0, 0] , [0, 0, 0] , [0, 0, 0]]
B = [[0]*3]*3

print(A) # 打印出:[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
print(B) # 打印出:[[0, 0, 0], [0, 0, 0], [0, 0, 0]]

# 雖然 2者 看是一樣,但其實不一樣

A[1][1] = 13
B[1][1] = 13

print(A) # 打印出:[[0, 0, 0], [0, 13, 0], [0, 0, 0]] 這裡只是 A[1][1] 位置的值改變
print(B) # 打印出:[[0, 13, 0], [0, 13, 0], [0, 13, 0]] 這裡對每個 B 裡的列表都做改變
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-13 08:29:56 From FishC Mobile | 显示全部楼层
傻眼貓咪 发表于 2021-9-12 22:16
正確寫法:

谢谢谢谢~但是我看了小甲鱼的视频,图片中为啥可以用A=[0]*3呀
A8AAC402-EFAE-43CC-B676-F9979225366D.jpeg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-13 09:08:48 | 显示全部楼层    本楼为最佳答案   
本帖最后由 洛阳城 于 2021-9-13 09:11 编辑

[0]*3得到的是[0, 0, 0]
因此
type(A[i])
是int,而int类型是不能调用append函数的
你仔细观察第一种方法中的第3句
A.append([])
所以这里的
type(A[i])
是list,是可以调用append的哦
这里想要达到你的效果只需要把
A=[0]*3
改成
A=[[]]*3
即可
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-13 12:00:56 | 显示全部楼层
本帖最后由 傻眼貓咪 于 2021-9-13 17:17 编辑
吉吉喆 发表于 2021-9-13 08:29
谢谢谢谢~但是我看了小甲鱼的视频,图片中为啥可以用A=[0]*3呀


小魚甲視頻沒有錯,確實也是可以用的。很多人都有用,當然包括我。
只是你必須要清楚知道你之後你想對列表做什麼,是否會有影響?

這是額外知識,當作送你吧:
A = [0]*3 沒有問題(A = [0, 0, 0]),因為裡面沒有另外一個列表
但如果是 A = [[0]*3]*3 (A = [[0, 0, 0], [0, 0, 0], [0, 0, 0])就要注意了

當你用這方法:A = [[0]*3]*3 創建列表時候,就注定之後每當你想改其中一個元素,其它同位置元素跟著改,比如:
A[0][1] = 13,這時候會變成 A = [[0, 13, 0], [0, 13, 0], [0, 13, 0]](不止A[0][1]改變,A[1][1] 和 A[2][1] 跟著改變了)

A = [[0]*3]*3 真正意思是將全部 A 裡面的元素(子列表)指向同一個對象

你不妨可以試試看用 A = [[0]*3]*3 創建列表,什麼都嘗試,你就會明白我說的

範例:
A = [[0, 0, 0]]*3
A[0][2] = 13
print(A)

B = [[]]*3
B[0].append(13)
print(B)
[[0, 0, 13], [0, 0, 13], [0, 0, 13]]
[[13], [13], [13]]

一般人不會深入了解指向對象問題,所以最後問題一堆堆
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-13 12:39:56 | 显示全部楼层
吉吉喆 发表于 2021-9-13 08:29
谢谢谢谢~但是我看了小甲鱼的视频,图片中为啥可以用A=[0]*3呀

因为这里直接把A[i] 给修改成 [0]*3了而不是用方法去添加
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-17 10:26:15 From FishC Mobile | 显示全部楼层
傻眼貓咪 发表于 2021-9-13 12:00
小魚甲視頻沒有錯,確實也是可以用的。很多人都有用,當然包括我。
只是你必須要清楚知道你之後你想對 ...

感恩
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-17 10:26:50 From FishC Mobile | 显示全部楼层
xjy=lwy 发表于 2021-9-13 12:39
因为这里直接把A 给修改成 [0]*3了而不是用方法去添加

谢谢谢谢~感恩的心
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 09:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表