Python初学者8号 发表于 2021-2-20 18:09:50

关于列表赋值出错


牛逼了,原来这样不可改参数啊!!
t = [,,]

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


0
0
0
0
0
0
0
0
0




这样才可以
t = [,,]

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


for i inrange(3):
    for j in range(3):
      t = 0
for each in t:
    print(each)

==========
0
0
0
0
0
0
0
0
0




【问题】 为什么是后者才可以?

Daniel_Zhang 发表于 2021-2-20 18:14:30

我也遇到过这个问题

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

第二种是指定了列表的第几个子列表的第几个元素,将值赋值给指定的元素

逃兵 发表于 2021-2-20 18:18:35

你修改变量e1的值跟列表t没啥关系


但是你修改t中元素的值就跟t有关系了

昨非 发表于 2021-2-20 18:31:05

for ..in..只起访问作用
是不能修改列表的

qiuyouzhi 发表于 2021-2-20 18:53:46

昨非 发表于 2021-2-20 18:31
for ..in..只起访问作用
是不能修改列表的

不对,for i in range(10): a = i 是可以的

qiuyouzhi 发表于 2021-2-20 18:54:33

因为类似于 for each in t: 这样的语句,each都只是一个单纯的变量,和列表无关
只有后者才可以真正的改变列表

Python初学者8号 发表于 2021-2-20 19:01:25

qiuyouzhi 发表于 2021-2-20 18:53
不对,for i in range(10): a = i 是可以的

这位大哥的意思应该是   你用你这样的方法,也是无法改变range(10)中的元素的值的{:10_277:}

Python初学者8号 发表于 2021-2-20 19:02:17

昨非 发表于 2021-2-20 18:31
for ..in..只起访问作用
是不能修改列表的

受教了,大哥{:10_243:}

Python初学者8号 发表于 2021-2-20 19:04:27

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

谢谢大哥{:10_254:}

Daniel_Zhang 发表于 2021-2-20 19:07:55

昨非 发表于 2021-2-20 18:31
for ..in..只起访问作用
是不能修改列表的

话太绝对了吧{:10_277:}

这个 for ...in...就能修改 list 的值
for i in range(len(list1)):
    list1 = 0

for each in list1 才是访问{:10_285:}

昨非 发表于 2021-2-20 19:23:33

Daniel_Zhang 发表于 2021-2-20 19:07
话太绝对了吧

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


我说的就是上面的情况,你这用索引本质和楼主第二种情况是一样的啊,{:10_250:}

昨非 发表于 2021-2-20 19:32:19

qiuyouzhi 发表于 2021-2-20 18:53
不对,for i in range(10): a = i 是可以的

是指初始化吗?

永恒的蓝色梦想 发表于 2021-2-20 19:32:52

qiuyouzhi 发表于 2021-2-20 18:53
不对,for i in range(10): a = i 是可以的

……我觉得你说的这个和问题没什么关系……

qiuyouzhi 发表于 2021-2-20 19:53:40

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

去..我的中括号被转义了
i的左右两边是有中括号的

qiuyouzhi 发表于 2021-2-20 19:55:00

昨非 发表于 2021-2-20 19:32
是指初始化吗?

中括号被转义了..i的左右两边是有中括号的..

考不好不改名 发表于 2021-2-20 20:54:24

本帖最后由 考不好不改名 于 2021-2-20 21:33 编辑

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

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

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

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

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

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

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

推而广之,列表各元素的值都变成了0。

Python初学者8号 发表于 2021-2-20 22:55:02

qiuyouzhi 发表于 2021-2-20 19:55
中括号被转义了..i的左右两边是有中括号的..

{:10_243:}怎么越来越 不懂你说的啥意思。。。

我现在只能理解为,for iinlist只能其遍历的作用,这里面的i 和实际的lis>>> t = list(range(6))
>>> t

>>> for i in t:
        print(id(i))

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

       
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
t(index)不是一个东西

Python初学者8号 发表于 2021-2-20 22:59:49

我懂了,确实和@昨非和@qiuyouzhi讲的一样,这里面for i in list只是进行遍历,应该理解这种循环是一种函数,这里面i只是临时的赋值而已>>> t = list(range(6))
>>> t

>>> for i in t:
        print(id(i))

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

       
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

>>> for i in range(6):
        t = t**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
页: [1]
查看完整版本: 关于列表赋值出错