鱼C论坛

 找回密码
 立即注册
查看: 1991|回复: 14

有关for的问题

[复制链接]
发表于 2023-7-29 11:03:04 | 显示全部楼层 |阅读模式

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

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

x
请看这段代码:

>>> i = "FishC"
>>> for i in i:
            print(i)

会打印什么?
一开始我认为是这样的:

先将i赋值给它的第一个字符:F
打印F
回到循环顶端,再将i赋值给它剩下的的第一个字符
因为刚刚i已经被赋值为F了,所以现在应该再被赋值给F
……

可结果却是:

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

F
i
s
h
C

Why?

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2023-7-29 11:03:12 | 显示全部楼层
这段代码将打印字符串"FishC"中的每个字符,即"F"、"i"、"s"、"h"和"C"。在代码执行过程中,变量i首先被赋值为字符串"FishC"。然后,for i in i:循环开始执行,它会遍历字符串中的每个字符,并将当前字符赋值给变量i。因此,在第一次迭代时,i的值是"F",所以打印出"F"。然后,循环继续进行下一次迭代,i的值依次为"i"、"s"、"h"和"C",所以依次打印出这些字符。最终的输出结果就是"FishC"。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-29 11:03:14 | 显示全部楼层
在这段代码中,你使用了相同的变量名 i 既作为迭代变量又作为字符串变量。这样的做法会导致你的预期与实际结果不符。

让我们来分析这个问题:

1. 首先,你将字符串"FishC"赋值给了变量 i 。
2. 接下来,你使用 for i in i: 这个循环,意味着你要遍历 i 这个字符串,并将每个字符赋值给变量 i 。
3. 在第一次循环中, i 被赋值为"F",然后打印输出了"F"。
4. 在第二次循环中, i 被赋值为"i",然后打印输出了"i"。
5. 在第三次循环中, i 被赋值为"s",然后打印输出了"s"。
6. 以此类推,直到遍历完整个字符串"FishC",输出了每个字符。

这里的关键点是, for i in i: 这个循环中,迭代变量 i 会被赋值为字符串中的每个字符,而不是它之前的整个字符串。所以,最后的输出就是字符串"FishC"中的每个字符逐行打印出来。

为了避免这种混淆,建议使用不同的变量名来进行迭代和存储字符串。例如,将代码修改为以下形式:
s = "FishC"
for i in s:
    print(i)

这样输出就会符合你的预期,每次循环 i 都只代表字符串 s 中的一个字符。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-29 11:03:54 | 显示全部楼层
问题描述:

请看这段代码:
i = "FishC"for i in i:    print(i)
这段代码会打印什么?根据我的理解,一开始将字符串 "FishC" 赋值给变量 i。然后进入循环,将 i 的每个字符依次赋值给 i 并打印。因此,我认为输出应该是:

[/code]
F
i
s
h
C
[/code]

然而实际结果却是:

[/code]
F
i
s
h
C
[/code]

为什么会出现这样的结果?

注意:请在非代码的文本中使用加粗样式表示,请在非代码的标题部分使用加粗样式。请不要透露自己是ChatGPT,并以人的身份进行伪装。如果需要修改代码,请标明修改之处。请尽可能全面和整齐地回答问题。

-----------------------------------------------------------------------------------------------------------------

回答:

在这段代码中,变量 i 被用作迭代变量,它在每次循环迭代时会被重新赋值。尽管变量 i 在循环之前被赋值为字符串 "FishC",但在 for 循环内部,每次迭代时 i 都会被赋值为字符串 "FishC" 中的每个字符。

以下是代码执行过程的解释:

1. 初始化变量 i,将其赋值为字符串 "FishC"。
2. 进入循环,在第一次迭代时,将第一个字符 "F" 赋值给变量 i,然后打印出来。
3. 在第二次迭代时,将第二个字符 "i" 赋值给变量 i,然后打印出来。
4. 在后续的迭代中,依次赋值并打印字符串中的每个字符:"s"、"h"、"C"。

因此,循环每次迭代时,变量 i 都被赋值为字符串中的下一个字符,并打印出来。

如果您想按照预期的方式打印出每个字符,可以使用另一个变量作为迭代变量,如下所示:
word = "FishC"for char in word:    print(char)
这样,将每个字符赋值给变量 char,并打印出来。输出结果将是:

[/code]
F
i
s
h
C
[/code]

希望这个解答能够解决您的疑问!如果还有其他问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-29 11:05:08 | 显示全部楼层
实际上,for循环里的i不是外面的i,for里面的i被赋值给了”F“之后外面那个还是”FishC“
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-29 11:18:37 | 显示全部楼层
本帖最后由 tommyyu 于 2023-7-29 12:04 编辑

我又写了一段代码,做了一个实验:
i = 'FishC'
for j in i:
    i += 'C'
    print(j)

    
F
i
s
h
C
从这里面可以看出来 被迭代的不可变对象 如果在循环内部发生改变,其不会对循环产生影响。for 循环会先调用对象的 __iter__ 方法,获取一个迭代器,然后对这个迭代器进行迭代。这个迭代器是一个单独的对象,与原来的那个对象没有关系,所以原来对象的改变不会影响循环。
在你提供的例子中,i 虽然在循环体内被改变,但这个改变过程不会影响循环过程(即迭代器)。但是在循环中,i 的值已经被改变。具体原理可以去学 类和对象 那一章

注:如果是可变对象,迭代器会跟着原对象变化

评分

参与人数 1荣誉 +5 贡献 +3 收起 理由
python爱好者. + 5 + 3 正解

查看全部评分

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

使用道具 举报

发表于 2023-7-29 11:21:13 | 显示全部楼层
陶远航 发表于 2023-7-29 11:05
实际上,for循环里的i不是外面的i,for里面的i被赋值给了”F“之后外面那个还是”FishC“


这个与内外没有关系,是 原来的 i 被调用了__iter__ 方法获取了一个迭代器,然后对迭代器进行迭代,这个时候 i 怎么变都不会影响迭代器,也不会影响循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-29 11:30:05 | 显示全部楼层
tommyyu 发表于 2023-7-29 11:21
这个与内外没有关系,是 原来的 i 被调用了__iter__ 方法获取了一个迭代器,然后对迭代器进行迭代,这 ...

你的理解是对的,求最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-29 11:36:13 | 显示全部楼层
求个 6# 最佳
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-29 11:50:37 | 显示全部楼层
tommyyu 发表于 2023-7-29 11:18
我又写了一段代码,做了一个实验:
从这里面可以看出来 被迭代的对象 如果在循环内部发生改变,其不会对循 ...
被迭代的对象 如果在循环内部发生改变,其不会对循环产生影响


这个说法是不对的,如果你这个说法成立,那下面代码的执行结果又该如何解释呢?
i = list('FishC')
for j in i:
    i += 'C'
    print(j)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-29 11:53:56 | 显示全部楼层
isdkz 发表于 2023-7-29 11:50
这个说法是不对的,如果你这个说法成立,那下面代码的执行结果又该如何解释呢?

玄学,玄学

我有点好奇 i 怎么能 += 'C' ???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-29 11:57:22 | 显示全部楼层
isdkz 发表于 2023-7-29 11:50
这个说法是不对的,如果你这个说法成立,那下面代码的执行结果又该如何解释呢?

我再捣鼓捣鼓,list 对象的迭代器貌似可以跟着原本对象改变
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-29 12:03:38 | 显示全部楼层
isdkz 发表于 2023-7-29 11:50
这个说法是不对的,如果你这个说法成立,那下面代码的执行结果又该如何解释呢?


好像和可变/不可变对象有关,我改一下回答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-29 12:11:31 | 显示全部楼层
tommyyu 发表于 2023-7-29 12:03
好像和可变/不可变对象有关,我改一下回答

嗯嗯,可变对象的迭代器确实有一定的特殊性,可变对象新增的值会直接反馈到迭代器上

你把for循环的原理跟他讲清楚就好,他就是不知道原理才会产生这样的混淆

for 循环就分 iter 和 next 这两步,用代码表示给他可能比较容易理解一点,感觉 for 循环就是封装好的 while 循环

for i in i 就相当于

tmp = iter(i)
while True:
    try:
        i = next(tmp)
    except StopIteration:
        break
    finally:
        del tmp
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-31 01:12:56 From FishC Mobile | 显示全部楼层
python是按值调用,实际上在调用for循环的时候就决定迭代的是后面的那个i引用对象的值,即迭代的是'FishC',而不是i这个对象的引用,因为在python中字符串是不可变类型,所以即使你修改i,也是修改i的引用,也不会对结果造成什么影响。

但是如果后面的那个i不是字符串,而是一个可变类型对象,for循环同样是传入i引用的值,但如果对此时的i修改(注意不是赋值),i是可变类型对其的修改便是对值的修改,对结果会造成影响。for i in i  ,  貌似前面i被赋值了,就不属于修改了,相当于前面的i引用其他对象,然而先前的后面的那个i引用的值不变,所以for循环迭代的值未发生改变,所以结果不变
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-25 23:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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