鱼C论坛

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

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

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

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

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

x

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

for out in  t:
    for el in out:
        el = 0
        print(el)
for each in t:
    print(each)

0
0
0
0
0
0
0
0
0
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]

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

##for out in  t:
##    for el in out:
##        el = 0
##        print(el)
##for each in t:
##    print(each)


for i in  range(3):
    for j in range(3):
        t[i][j] = 0
for each in t:
    print(each)
==========
0
0
0
0
0
0
0
0
0
[0, 0, 0]
[0, 0, 0]
[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] = 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 的值
for i in range(len(list1)):
    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语言写的啊)。

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

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

for语句会让变量遍历列表的每一个元素,即让指针分别指向每一个元素,如:
ls = [1, 2, 3]
for each in ls:
    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的值,列表不变)

那么,另外一个例子:
ls = [1, 2, 3]
for i in range(len(ls)):
    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
>>> t = list(range(6))
>>> t
[0, 1, 2, 3, 4, 5]
>>> for i in t:
        print(id(i))

        
140718108612224
140718108612256
140718108612288
140718108612320
140718108612352
140718108612384
>>> for i in range(6):
        print(id(t[i]))

        
140718108612224
140718108612256
140718108612288
140718108612320
140718108612352
140718108612384
>>> for i in t:
        i = i**2
        print('i= %s,id(%s) '%(i,id(i)))

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

使用道具 举报

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

        
140718108612224
140718108612256
140718108612288
140718108612320
140718108612352
140718108612384
>>> for i in range(6):
        print(id(t[i]))

        
140718108612224
140718108612256
140718108612288
140718108612320
140718108612352
140718108612384
>>> for i in t:
        i = i**2
        print('i= %s,id(%s) '%(i,id(i)))

        
i= 0,id(140718108612224) 
i= 1,id(140718108612256) 
i= 4,id(140718108612352) 
i= 9,id(140718108612512) 
i= 16,id(140718108612736) 
i= 25,id(140718108613024) 
>>> t
[0, 1, 2, 3, 4, 5]
>>> for i in range(6):
        t[i] = t[i]**2
        print('i= %s,id(%s)=%s '%(i,i,id(i)))

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 10:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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