鱼C论坛

 找回密码
 立即注册
查看: 2361|回复: 17

[已解决]关于列表赋值出错

[复制链接]
发表于 2021-2-20 18:09:50 | 显示全部楼层 |阅读模式

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

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

x

牛逼了,原来这样不可改参数啊!!
  1. t = [[1,2,3],[4,5,6],[7,8,9]]

  2. for out in  t:
  3.     for el in out:
  4.         el = 0
  5.         print(el)
  6. for each in t:
  7.     print(each)
复制代码


  1. 0
  2. 0
  3. 0
  4. 0
  5. 0
  6. 0
  7. 0
  8. 0
  9. 0
  10. [1, 2, 3]
  11. [4, 5, 6]
  12. [7, 8, 9]
复制代码


这样才可以
  1. t = [[1,2,3],[4,5,6],[7,8,9]]

  2. ##for out in  t:
  3. ##    for el in out:
  4. ##        el = 0
  5. ##        print(el)
  6. ##for each in t:
  7. ##    print(each)


  8. for i in  range(3):
  9.     for j in range(3):
  10.         t[i][j] = 0
  11. for each in t:
  12.     print(each)
复制代码

  1. ==========
  2. 0
  3. 0
  4. 0
  5. 0
  6. 0
  7. 0
  8. 0
  9. 0
  10. 0
  11. [0, 0, 0]
  12. [0, 0, 0]
  13. [0, 0, 0]
复制代码


【问题】 为什么是后者才可以?
最佳答案
2021-2-20 18:31:05
for ..in..只起访问作用
是不能修改列表的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-20 18:14:30 | 显示全部楼层
我也遇到过这个问题

我感觉是因为第一个 el 只是作为一个变量,原列表的数值赋值给了变量,所以你每次修改的都是 变量 el 的值,而非列表的值

第二种是指定了列表的第几个子列表的第几个元素,将值赋值给指定的元素
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-2-20 18:18:35 | 显示全部楼层
你修改变量e1的值跟列表t没啥关系


但是你修改t中元素的值就跟t有关系了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2021-2-20 18:31:05 | 显示全部楼层    本楼为最佳答案   
for ..in..只起访问作用
是不能修改列表的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-20 18:53:46 | 显示全部楼层
昨非 发表于 2021-2-20 18:31
for ..in..只起访问作用
是不能修改列表的

不对,for i in range(10): a = i 是可以的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-20 18:54:33 | 显示全部楼层
因为类似于 for each in t: 这样的语句,each都只是一个单纯的变量,和列表无关
只有后者才可以真正的改变列表
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-20 19:01:25 | 显示全部楼层
qiuyouzhi 发表于 2021-2-20 18:53
不对,for i in range(10): a = i 是可以的

这位大哥的意思应该是   你用你这样的方法,也是无法改变range(10)中的元素的值的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-20 19:02:17 | 显示全部楼层
昨非 发表于 2021-2-20 18:31
for ..in..只起访问作用
是不能修改列表的

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

使用道具 举报

 楼主| 发表于 2021-2-20 19:04:27 | 显示全部楼层
qiuyouzhi 发表于 2021-2-20 18:54
因为类似于 for each in t: 这样的语句,each都只是一个单纯的变量,和列表无关
只有后者才可以真正的改变 ...

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

使用道具 举报

发表于 2021-2-20 19:07:55 | 显示全部楼层
昨非 发表于 2021-2-20 18:31
for ..in..只起访问作用
是不能修改列表的

话太绝对了吧

这个 for ...in...就能修改 list 的值
  1. for i in range(len(list1)):
  2.     list1[i] = 0
复制代码


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

使用道具 举报

发表于 2021-2-20 19:23:33 From FishC Mobile | 显示全部楼层
Daniel_Zhang 发表于 2021-2-20 19:07
话太绝对了吧

这个 for ...in...就能修改 list 的值

我说的就是上面的情况,你这用索引本质和楼主第二种情况是一样的啊,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-20 19:32:19 From FishC Mobile | 显示全部楼层
qiuyouzhi 发表于 2021-2-20 18:53
不对,for i in range(10): a = i 是可以的

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

使用道具 举报

发表于 2021-2-20 19:32:52 | 显示全部楼层
qiuyouzhi 发表于 2021-2-20 18:53
不对,for i in range(10): a = i 是可以的

……我觉得你说的这个和问题没什么关系……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-20 19:53:40 | 显示全部楼层
Python初学者8号 发表于 2021-2-20 19:01
这位大哥的意思应该是   你用你这样的方法,也是无法改变range(10)中的元素的值的


去..我的中括号被转义了
i的左右两边是有中括号的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-20 19:55:00 | 显示全部楼层
昨非 发表于 2021-2-20 19:32
是指初始化吗?

中括号被转义了..i的左右两边是有中括号的..
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-20 20:54:24 | 显示全部楼层
本帖最后由 考不好不改名 于 2021-2-20 21:33 编辑

声明:下文中不一定表述准确和严谨,可能有很大纰漏、错误,请大家指正(事实可能不是如我所说,但应该可以这样·理·解·,我就是这么理解的)。

这个问题得从指针讲起(当然Python里没有指针,但是Python是用C语言写的啊)。

变量本质上是指向常量的指针,如:
  1. a = 1
复制代码
其实就是让变量a指向常量1,当访问变量a时,会顺着指针访问常量1。

列表就是一堆指针,如:
  1. ls = [1, 2, 3]
复制代码
可以理解为:ls[0] -> 1; ls[1] -> 2; ls[2]->3

for语句会让变量遍历列表的每一个元素,即让指针分别指向每一个元素,如:
  1. ls = [1, 2, 3]
  2. for each in ls:
  3.     each = 0
复制代码
第一次循环开始前,各变量及其指向是这样的:
ls[0] -> 1; ls[1] -> 2; ls[2]->3;
each -> 1(这里之所以不是 each -> ls[0] 是由于赋值语句的结合性(Python不讨论,但C语言讨论),右边先被计算出来,返回常量1)

执行第一次 each = 0 后,各变量及其指向是这样的:
ls[0] -> 1; ls[1] -> 2; ls[2]->3;
each -> 0(可见,赋值语句仅仅改变了本次循环中each的值,列表不变)

那么,另外一个例子:
  1. ls = [1, 2, 3]
  2. for i in range(len(ls)):
  3.     ls[i] = 0
复制代码
第一次循环开始前,各变量及其指向是这样的:
ls[0] -> 1; ls[1] -> 2; ls[2]->3;
i -> 0
那么第一次赋值语句即为 ls[0] = 0,列表的值被改变。

推而广之,列表各元素的值都变成了0。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-2-20 22:55:02 | 显示全部楼层
qiuyouzhi 发表于 2021-2-20 19:55
中括号被转义了..i的左右两边是有中括号的..

怎么越来越 不懂你说的啥意思。。。

我现在只能理解为,for i  in  list只能其遍历的作用,这里面的i 和实际的lis
  1. >>> t = list(range(6))
  2. >>> t
  3. [0, 1, 2, 3, 4, 5]
  4. >>> for i in t:
  5.         print(id(i))

  6.        
  7. 140718108612224
  8. 140718108612256
  9. 140718108612288
  10. 140718108612320
  11. 140718108612352
  12. 140718108612384
  13. >>> for i in range(6):
  14.         print(id(t[i]))

  15.        
  16. 140718108612224
  17. 140718108612256
  18. 140718108612288
  19. 140718108612320
  20. 140718108612352
  21. 140718108612384
  22. >>> for i in t:
  23.         i = i**2
  24.         print('i= %s,id(%s) '%(i,id(i)))

  25.        
  26. i= 0,id(140718108612224)
  27. i= 1,id(140718108612256)
  28. i= 4,id(140718108612352)
  29. i= 9,id(140718108612512)
  30. i= 16,id(140718108612736)
  31. i= 25,id(140718108613024)
  32. >>> t
  33. [0, 1, 2, 3, 4, 5]
复制代码
t(index)不是一个东西
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-20 22:59:49 | 显示全部楼层
我懂了,确实和@昨非和@qiuyouzhi  讲的一样,这里面for i in list只是进行遍历,应该理解这种循环是一种函数,这里面i只是临时的赋值而已
  1. >>> t = list(range(6))
  2. >>> t
  3. [0, 1, 2, 3, 4, 5]
  4. >>> for i in t:
  5.         print(id(i))

  6.        
  7. 140718108612224
  8. 140718108612256
  9. 140718108612288
  10. 140718108612320
  11. 140718108612352
  12. 140718108612384
  13. >>> for i in range(6):
  14.         print(id(t[i]))

  15.        
  16. 140718108612224
  17. 140718108612256
  18. 140718108612288
  19. 140718108612320
  20. 140718108612352
  21. 140718108612384
  22. >>> for i in t:
  23.         i = i**2
  24.         print('i= %s,id(%s) '%(i,id(i)))

  25.        
  26. i= 0,id(140718108612224)
  27. i= 1,id(140718108612256)
  28. i= 4,id(140718108612352)
  29. i= 9,id(140718108612512)
  30. i= 16,id(140718108612736)
  31. i= 25,id(140718108613024)
  32. >>> t
  33. [0, 1, 2, 3, 4, 5]
  34. >>> for i in range(6):
  35.         t[i] = t[i]**2
  36.         print('i= %s,id(%s)=%s '%(i,i,id(i)))

  37.        
  38. i= 0,id(0)=140718108612224
  39. i= 1,id(1)=140718108612256
  40. i= 2,id(2)=140718108612288
  41. i= 3,id(3)=140718108612320
  42. i= 4,id(4)=140718108612352
  43. i= 5,id(5)=140718108612384
  44. >>> t
  45. [0, 1, 4, 9, 16, 25]
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 04:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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