鱼C论坛

 找回密码
 立即注册
查看: 20713|回复: 65

[知识点备忘] 第022讲:列表(IV)

[复制链接]
发表于 2020-7-16 20:48:32 | 显示全部楼层 |阅读模式
购买主题 已有 25 人购买  本主题需向作者支付 5 鱼币 才能浏览
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-19 07:53:10 | 显示全部楼层
功亏不负有心人
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-10 21:01:41 | 显示全部楼层
还是不懂 A = [[0] * 3] * 3 为什么不行。
A is B == True 意思是 A 和 B 是同一个对象?存储地址相同?改变 A 的同时会改变 B?
但是下面的代码里面A[0]和A[1]又不同时改变。这是为什么呢?
>>> A = [0] * 3
>>> A
[0, 0, 0]
>>> A[0] is A[1]
True
>>> A[0] = 1
>>> A
[1, 0, 0]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 5 反对 0

使用道具 举报

发表于 2021-3-18 15:52:46 | 显示全部楼层
大毛不困 发表于 2020-9-10 21:01
还是不懂 A = [[0] * 3] * 3 为什么不行。
A is B == True 意思是 A 和 B 是同一个对象?存储地址相同?改 ...

is ,当成==是不是就能理解了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 2

使用道具 举报

发表于 2021-3-28 15:39:24 | 显示全部楼层
大毛不困 发表于 2020-9-10 21:01
还是不懂 A = [[0] * 3] * 3 为什么不行。
A is B == True 意思是 A 和 B 是同一个对象?存储地址相同?改 ...

应该是A[0]是元素,不是列表,元素的话肯定相同啊就和字符串一样0==0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-4-7 10:20:37 | 显示全部楼层
**1.列表的加法和乘法**

列表的加法是拼接,要求加号两边都是列表。

>>> s = [1,  2,  3]
>>> t = [4,  5,  6]
>>> s + t
[1,  2,  3,  4,  5,  6]

列表的乘法是重复列表内的所有元素若干次

>>> s * 3
[1,  2,  3,  1,  2,  3,  1,  2,  3]

**2.嵌套列表**

嵌套列表就是在列表里面嵌入一个新的列表。

创建一个二维列表:

>>> matrix = [[1, 2, 3],[4, 5, 6],[7, 8, 9]]

创建二维列表的语句还可以这么写:

>>> matrix = [[1, 2, 3],
                       [4, 5, 6],
                       [7, 8, 9]]
>>> matrix
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]               

这两种写法是等价的。第二种写法与第一种写法打印出的内容一样,第二种写法的好处是显得更为直观。

**3.访问嵌套列表**

访问嵌套列表中的元素,我们可是使用循环来实现。
迭代一个列表我们使用一层循环,迭代嵌套列表我们就应该相应使用使用嵌套循环。

>>> for i in matrix:
        for each in i:
                print(each)

               
1
2
3
4
5
6
7
8
9

[可以看到整个列表的所有数据]

改装,添加空格和换行

>>> for i in matrix:
        for each in i:
                print(each,end=' ')
        print()
[ print默认最后跟一个换行符,end = ' '改为以空格隔开各元素 ]
       
1 2 3
4 5 6
7 8 9

[列表更加直观]

通过下标,同样是可以访问列表的:

>>> matrix[0]
[1, 2, 3]

[我们只给出一个下标索引,我们得到的是以行为单位的整个列表]

为了访问列表中的列表的元素,我们需要使用两次下标索引

>>> matrix[0][0]
1
>>> matrix[1][1]
5
>>> matrix[2][2]
9

上面我们通过每个元素的值来创建二维列表,除此之外,还可以通过循环语句创建并初始化二维列表

>>> A = [0] * 3
>>> A
[0, 0, 0]

通过迭代,创建一个二维列表

>>> for i in range(3):
        A[i] = [0] * 3
>>> A
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]

B的方法是错误的,而且错的非常高级,通常不容易发现。

>>> B = [[0] * 3] * 3
>>> B
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> A[1][1] = 1
>>> A
[[0, 0, 0], [0, 1, 0], [0, 0, 0]]
>>> B[1][1] = 1
>>> B
[[0, 1, 0], [0, 1, 0], [0, 1, 0]]
[B相当于每一个列表复制粘贴了三次,所以一个列表有改动,其他列表也会跟着改]

**4.运算符is**

也称之为同一性运算符,用于检验两个变量是否指向同一个对象的一个运算符。

>>> x = "FishC"
>>> y = "FishC"
>>> x is y
True

>>> x = [1, 2, 3]
>>> y = [1, 2, 3]
>>> x is y
False
[这说明python对于不同对象的存储机制是不一样的
字符串是不可变的,只需要在内存中开辟一个位置来存放,
列表是可变的,尽管两个列表内容一样,但python还是需要为它们开辟两个不同的位置]

进行"亲子鉴定"

>>> A[0] is A[2]
False
>>> B[0] is B[1]
True
>>> B[1] is B[2]
True
[B实际拷贝的只是对同一个列表的引用]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 13 反对 0

使用道具 举报

发表于 2021-5-17 15:21:20 | 显示全部楼层
zdasd 发表于 2021-4-7 10:20
**1.列表的加法和乘法**

列表的加法是拼接,要求加号两边都是列表。

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

使用道具 举报

发表于 2021-6-20 10:31:31 | 显示全部楼层
大毛不困 发表于 2020-9-10 21:01
还是不懂 A = [[0] * 3] * 3 为什么不行。
A is B == True 意思是 A 和 B 是同一个对象?存储地址相同?改 ...

因为A[0]和A[1]为只读数据类型,当A[0] = 0,A[1] = 0时,python解释器会“偷懒”,将变量名A[0],A[1]共同绑定在一个0这个整数上,而不是一个变量名绑定一个0,所以A[0] is A[1]为True,但当A[0](或A[1)]重新赋不与原来相同的值时,A[0](或A[1])将重新绑定一个新的值,所以此时A[0]与A[1]是分别指向不同值的对象,此时id(A[0])!=id(A[1]),之前的id(A[0])==id(A[1])的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 3 反对 0

使用道具 举报

发表于 2021-7-23 16:19:30 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-10 13:56:28 | 显示全部楼层
打卡022
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2021-8-10 20:10:15 | 显示全部楼层
已复习,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2021-9-10 15:24:03 | 显示全部楼层
厉害了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2021-10-8 15:21:18 | 显示全部楼层
绘梨衣forever 发表于 2021-3-18 15:52
is ,当成==是不是就能理解了?

好像不一样吧。is是用于检验两个变量是否指向同个对象(也就是存储的位置是否相同),==是判断两边的值(数据)是否相等。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-26 09:35:24 | 显示全部楼层
大毛不困 发表于 2020-9-10 21:01
还是不懂 A = [[0] * 3] * 3 为什么不行。
A is B == True 意思是 A 和 B 是同一个对象?存储地址相同?改 ...

你这个只是单个列表,所以这样该就没什么问题,举个栗子:如果你的列表是二维列表,你去试试,它里面嵌套同一个二维列表的同一个索引值便会有所不同,
   A = [[0,0,0], [0,0,0], [0,0,0]]:(假设我这个列表是通过“A = [0] * 3”),这种形式创建出来的则会表现出这种情况:A[0] = 1
         A[[1,0,0], [1,0,0], [1,0,0]]

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

使用道具 举报

发表于 2021-12-16 06:24:59 | 显示全部楼层
本帖最后由 是阿佳! 于 2021-12-16 06:31 编辑

试图通过乘号对一个嵌套列表进行拷贝,事实上拷贝的是对同一个列表的引用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-16 06:31:09 | 显示全部楼层
是阿佳! 发表于 2021-12-16 06:24
试图通过乘号对一个嵌套列表进行拷贝,事实上拷贝的是对同一个列表的应用

#正确做法初始化列表
A = [0,0,0]
for i in range(3):

    #这是把[0,0,0]的每个元素赋值为[0]*3,即是赋值为[0,0,0]
    A[i] = [0] * 3
print(A)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-10 10:06:28 | 显示全部楼层
本帖最后由 yangshengyang 于 2022-2-10 10:53 编辑

看视频明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-24 10:55:07 | 显示全部楼层
打卡~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-2 19:49:06 | 显示全部楼层
大毛不困 发表于 2020-9-10 21:01
还是不懂 A = [[0] * 3] * 3 为什么不行。
A is B == True 意思是 A 和 B 是同一个对象?存储地址相同?改 ...

应该就是存储地址相同
A[0] A[1]存在同一个地方 所以是True
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-14 22:49:15 | 显示全部楼层
打卡
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 19:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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