鱼C论坛

 找回密码
 立即注册
查看: 2671|回复: 15

[已解决]列表内置方法的疑问

[复制链接]
发表于 2017-11-16 06:00:20 | 显示全部楼层 |阅读模式

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

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

x
1. 333.jpg

2. 关于内置方法index,help里提到的是返回第一索引值,如该值不存在,则提示数值错误(return first index of value. Raises ValueError if the value is not present.) 没搞懂这意思,自己用了下,还是看不懂~~求解。。
index.jpg

3. extend 和append的内置方法,help说append是输入数据,而extend则是输入迭代器(iterable),有点不太懂,这两个有什么区别? 我怎么感觉是一样的,至多的区别就是extend强大些,可以在末端扩展列表,而append只能一次在末端增加一个元素。。
360截图20171114055941252.jpg

4. list.copy()这个内置方法有什么用途?复制一个出来,后面如果改变了这个列表,原先复制的不照样改变。这个不是可以用另外一个列表=原列表,不是更好用?
最佳答案
2017-11-17 08:45:12
老笨啊 发表于 2017-11-17 05:56
extend和append的区别,我感觉你说的,和我理解的差不多啊。。就是extend更强大些,可以完全覆盖append的 ...

extend方法扩展出来的列表是一维列表:
示例一:
  1. >>> a = [1,2,3,4,5]
  2. >>> b = a.extend([6,7,8,9])
  3. >>> a
  4. [1, 2, 3, 4, 5, 6, 7, 8, 9]
  5. >>>
复制代码


而用append方法也可以扩展,但是是多维列表:
示例二:
  1. >>> a = [1,2,3,4,5]
  2. >>> a.append([6,7,8,9])
  3. >>> a
  4. [1, 2, 3, 4, 5, [6, 7, 8, 9]]
  5. >>>
复制代码


区别就是,同样都是1~9组成的列表,用extend扩展得到的是有9个元素的列表;而用append方法得到的是只有6个元素的列表,索引值5对应的元素本身就是另一个列表。

正是有了这样的区别,所以,你在用copy()方法对一维列表进行拷贝的时候,得到一个全新的列表,两个列表位于内存的不同位置;

但是你用copy()方法对示例二的多维列表进行拷贝时也会得到一个全新的列表,但是他们只有成员“1,2,3,4,5”是位于内存的不同位置,而第6个成员[6,7,8,9]还是引用自源列表,所以,你对其任意一个元素进行修改都会影响另一个列表。这就是python的浅度拷贝,他还有一个深度拷贝方法deepcopy()用这个方法就能保证列表的所有成员都保存与内存的不同位置,从而不会相互影响。

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-11-16 09:32:41 | 显示全部楼层
1 None和interger指的就是返回值
  
2 lst.index(x[, i[, j])表示索引从下标为i到j-1的所有元素,返回第一个和x相等的下标值,如果缺省,那么索引所有值
比如 m1.index(3,0,8)表示找列表m1中下标从0到7的所有值,返回第一个等于3的下标,明显就是0

3 append只能添加一个元素,这个元素可以是任何类型,但是添加的结果就是原列表只能增加一个元素
  extend可以添加一个可迭代对象,和append的主要区别在于可以对原列表同时添加多个元素

4 copy函数用来浅拷贝,关于拷贝相关,你可以查看一下copy模块,里面有真正的深拷贝函数deepcopy
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-16 09:42:38 | 显示全部楼层
2. 关于index( )
你的示例不是很清楚地显示了这个BIF的作用吗。
>>> m1 = [3,5,7,2,77,3,7,3]  #你定义了一个列表,包含8个元素,索引值从0~7
>>> m1.index(3)  #然后你用index()方法获得元素3在列表中的位置
0  # 元素3在列表的第一个位置,所以返回0(索引值)。

>>> m1.index(3,0,8)  # 这里你还是在列表中获取元素 3 的索引值,不过设置了查找范围 0~8
>>> 0 # 还是索引值。


3. extend和append内置方法区别在于extend方法是用一个列表去扩展另一个列表,也就是说extend方法一次可以向列表中添加多个元素,而append方法一次只能添加一个元素。也可以用append方法添加一个列表,但是生成的是一个二维列表,就像你的示例那样。

4. list.copy()是复制一个列表,它会返回一个新列表。你对这两个列表做的任何修改都不会影响另一个。除非源列表是一个多维列表。(看图)
C:\Users\zoomh\Desktop\111.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-16 09:43:53 | 显示全部楼层
2. 关于index( )
你的示例不是很清楚地显示了这个BIF的作用吗。
>>> m1 = [3,5,7,2,77,3,7,3]  #你定义了一个列表,包含8个元素,索引值从0~7
>>> m1.index(3)  #然后你用index()方法获得元素3在列表中的位置
0  # 元素3在列表的第一个位置,所以返回0(索引值)。

>>> m1.index(3,0,8)  # 这里你还是在列表中获取元素 3 的索引值,不过设置了查找范围 0~8
>>> 0 # 还是索引值。


3. extend和append内置方法区别在于extend方法是用一个列表去扩展另一个列表,也就是说extend方法一次可以向列表中添加多个元素,而append方法一次只能添加一个元素。也可以用append方法添加一个列表,但是生成的是一个二维列表,就像你的示例那样。

4. list.copy()是复制一个列表,它会返回一个新列表。你对这两个列表做的任何修改都不会影响另一个。除非源列表是一个多维列表。(看图)
111.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-17 05:44:50 | 显示全部楼层
BngThea 发表于 2017-11-16 09:32
1 None和interger指的就是返回值
  
2 lst.index(x[, i[, j])表示索引从下标为i到j-1的所有元素,返回第 ...

360截图20171117054133336.jpg

关于返回为None的,我自己试了下,的确没有返回东西啊~~另外有说明返回值的,如pop, count则是直接返回了数值出来的~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-17 05:56:38 | 显示全部楼层
铁棍阿童木 发表于 2017-11-16 09:43
2. 关于index( )
你的示例不是很清楚地显示了这个BIF的作用吗。
>>> m1 = [3,5,7,2,77,3,7,3]  #你定义了 ...

extend和append的区别,我感觉你说的,和我理解的差不多啊。。就是extend更强大些,可以完全覆盖append的功能。那这个append有存在的必要么?
看了你关于copy的做法,有点迷糊了。insert对列表a做改变时,b不动。。这个可以理解。而del改变列表a时,却连带将列表b也改变了。。怎么会这样。。那我怎么知道什么内置方法不会影响列表b呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-17 08:45:12 | 显示全部楼层    本楼为最佳答案   
老笨啊 发表于 2017-11-17 05:56
extend和append的区别,我感觉你说的,和我理解的差不多啊。。就是extend更强大些,可以完全覆盖append的 ...

extend方法扩展出来的列表是一维列表:
示例一:
  1. >>> a = [1,2,3,4,5]
  2. >>> b = a.extend([6,7,8,9])
  3. >>> a
  4. [1, 2, 3, 4, 5, 6, 7, 8, 9]
  5. >>>
复制代码


而用append方法也可以扩展,但是是多维列表:
示例二:
  1. >>> a = [1,2,3,4,5]
  2. >>> a.append([6,7,8,9])
  3. >>> a
  4. [1, 2, 3, 4, 5, [6, 7, 8, 9]]
  5. >>>
复制代码


区别就是,同样都是1~9组成的列表,用extend扩展得到的是有9个元素的列表;而用append方法得到的是只有6个元素的列表,索引值5对应的元素本身就是另一个列表。

正是有了这样的区别,所以,你在用copy()方法对一维列表进行拷贝的时候,得到一个全新的列表,两个列表位于内存的不同位置;

但是你用copy()方法对示例二的多维列表进行拷贝时也会得到一个全新的列表,但是他们只有成员“1,2,3,4,5”是位于内存的不同位置,而第6个成员[6,7,8,9]还是引用自源列表,所以,你对其任意一个元素进行修改都会影响另一个列表。这就是python的浅度拷贝,他还有一个深度拷贝方法deepcopy()用这个方法就能保证列表的所有成员都保存与内存的不同位置,从而不会相互影响。

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-17 09:35:30 From FishC Mobile | 显示全部楼层
老笨啊 发表于 2017-11-17 05:44
关于返回为None的,我自己试了下,的确没有返回东西啊~~另外有说明返回值的,如pop, count则是直接返 ...

返回None的,你用print打印一下就知道了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-17 09:52:56 | 显示全部楼层
老笨啊 发表于 2017-11-17 05:44
关于返回为None的,我自己试了下,的确没有返回东西啊~~另外有说明返回值的,如pop, count则是直接返 ...

这个在后面的课程会讲到:有关于python任何对象都会有返回值,而没有设置返回值的,统一返回None,而None不会显示出来,你如果想看到None,可以试图用print打印那些没有返回任何东西的对象
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-11-17 09:59:46 | 显示全部楼层
老笨啊 发表于 2017-11-17 05:56
extend和append的区别,我感觉你说的,和我理解的差不多啊。。就是extend更强大些,可以完全覆盖append的 ...

你想一下,extend它是拓展列表本身,所以extend它所添加的东西和被添加的对象都是列表,
                append它是像列表里面增加任何类型的元素,这样看来,append的作用范围岂不是更大
              
                在后面你会接触到,从另一个列表中筛选出单个元素添加进另一个列表,而筛选单个元素这个筛选出来的是元素,而不会列表,你怎么能用extend去添加它进入另一个列表呢
                 所以说,不要轻易去评价一个内置函数的存在意义,不同的运用环境造就了不同的函数方法,存在即合理。

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-20 06:05:08 | 显示全部楼层
BngThea 发表于 2017-11-17 09:35
返回None的,你用print打印一下就知道了

我知道可以用print打印出来看。。。关键为什么有的有明确返回值,有的虽然说的返回Nore,实际又是打印出来的。这个None到底是什么意思?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-20 06:06:50 | 显示全部楼层
JAY饭 发表于 2017-11-17 09:52
这个在后面的课程会讲到:有关于python任何对象都会有返回值,而没有设置返回值的,统一返回None,而None ...

你意思是python的任何对象都会有返回值,只是设不设置返回值而已?设置了的,直接返回出来。没有设置的,则需要用print打印出来?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-20 06:10:16 | 显示全部楼层
铁棍阿童木 发表于 2017-11-17 08:45
extend方法扩展出来的列表是一维列表:
示例一:

关于copy方法,为什么第6个成员还是引用自源列表?用这个copy浅拷贝,我怎么知道到底哪些元素是引用自源列表?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-20 10:34:48 From FishC Mobile | 显示全部楼层
学习了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-20 13:42:33 | 显示全部楼层
None也是一种返回值。

  1. list.pop()
复制代码

该方法的作用是:
1. 尝试删除list中末尾的一个元素,如果无则报错。
2. 将这个元素作为值返回。
  1. list.clear()
复制代码

该方法的作用是:
1. 清空该list。
2. 返回None。(因为不需要有其他返回。)

这些方法的返回值有什么用要结合实际情况。

关于深浅copy:

一个重要的区别是copy的对象是不是可变类型,有没有改变其自身的方法(包括内置和自写)。

举个栗子:
  1. list1 = [1, '2', (3,4), {5, 6}]
  2. list2 = list1.copy()
复制代码

这个copy是浅拷贝。
如果我们这时操作list2.
比如
list2[0], 这个0是个整数,整数没有改变其自身的方法,也不是可变类型,所以不论我们怎么操作list1都不会受影响。
list2[1], 这是个字符串,字符和整数一样,也不是可变类型,他有大堆方法,但并不会操作自身。
  1. list2[1].replace('2', '3')
复制代码
是不会改变这个字符串的。
list2[2], 这是个元组, 他也是不可变类型。list2[3],这是个集合,这是个可变类型。
如list2[3].update({7}),这样不仅会改变list2,也同样改变list1.

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-21 05:44:25 | 显示全部楼层
wei_Y 发表于 2017-11-20 13:42
None也是一种返回值。

你意思就是,整形、字符串、元组之类的,都不是可变类型。那同理,那浮点型、布尔型等,都不是可变类型。
我目前学到的,只知道列表是可变类型。。其他还有什么是可变类型呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-4 00:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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