鱼C论坛

 找回密码
 立即注册
查看: 1250|回复: 6

[已解决]各位大佬,这是一个有关列表交换数值的问题,麻烦了

[复制链接]
发表于 2022-5-16 09:37:07 | 显示全部楼层 |阅读模式

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

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

x
这是第一次代码:```

s = [1, 2, 3, 4]
s[0], s[s.index(2)] = s[s.index(2)], s[0]
print(s)
这时输出的列表顺序是不变的

这是第二次代码:```
s = [1, 2, 3, 4]
s[0], s[1] = s[1], s[0]
print(s```

这时输出的列表顺序改变了

想请教为什么会出现这种情况?




最佳答案
2022-5-16 10:15:44
本帖最后由 傻眼貓咪 于 2022-5-16 10:16 编辑

Python 语法让大家方便,但由于太方便,导致很多程序员迷失在代码里,因为完全看不到底层运作。

例子:
a = 13
b = 5
a, b = b, a

这里没有问题吧?纯粹交换值
如果把它写成更容易读呢?

t = a
a = b
b = t

同理,以你的代码为例:

s = [1, 2, 3, 4]
s[0], s[s.index(2)] = s[s.index(2)], s[0]

可以写成:

t = s[0]
s[0] = s[s.index(2)] # 这时 2 的位置已改变
s[s.index(2)] = t # 变回原来的样子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-16 10:06:55 From FishC Mobile | 显示全部楼层
建议不要这样写代码,我也没有看过有人这样写代码。你的问题出在s.index(2) 已经不是原来的 s.index(2) 了,两个 s.index(2) 值不一样,你可以试试改成:
  1. s = [1, 2, 3, 4]
  2. i = s.index(2) # 多加这一行确保 s.index(2) 值是原来的值
  3. s[0], s[i] = s[i], s[0]
  4. print(s)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-16 10:08:38 | 显示全部楼层

没想到这样还会有不同的输出结果,我的理解是:

等号左边的元素赋值是基于新生成的列表,而等号右边的则是基于原列表(这样就会导致 index() 的值发生改变),例如第一个代码:

s[0] 先赋值为 s[s.index(2)],此时新生成的列表就变为 : [2, 2, 3, 4] 原列表还是 [1, 2, 3, 4]

然后再进行 s[s.index(2)] 赋值为 s[0] ,因为左边基于新列表索引,那么此时 s.index(2) 就变成了 0  

而右边的 s[0] 基于原列表,即索引 0 上元素为 1,则这就相当于将新列表的 0 索引位置 2 元素重新覆盖为 原列表上 0 索引位置的  1 元素

以上的是基于个人猜想,不能保证正确性,第一次见到这种情况,仅供参考...

第二段代码因为是直接用下标,所以下标不存在改变的情况,自然直接成功替换了元素的位置进行输出

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

使用道具 举报

发表于 2022-5-16 10:15:44 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
本帖最后由 傻眼貓咪 于 2022-5-16 10:16 编辑

Python 语法让大家方便,但由于太方便,导致很多程序员迷失在代码里,因为完全看不到底层运作。

例子:
a = 13
b = 5
a, b = b, a

这里没有问题吧?纯粹交换值
如果把它写成更容易读呢?

t = a
a = b
b = t

同理,以你的代码为例:

s = [1, 2, 3, 4]
s[0], s[s.index(2)] = s[s.index(2)], s[0]

可以写成:

t = s[0]
s[0] = s[s.index(2)] # 这时 2 的位置已改变
s[s.index(2)] = t # 变回原来的样子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-16 14:33:26 | 显示全部楼层
傻眼貓咪 发表于 2022-5-16 10:15
Python 语法让大家方便,但由于太方便,导致很多程序员迷失在代码里,因为完全看不到底层运作。

例子:
...

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

使用道具 举报

 楼主| 发表于 2022-5-16 14:34:25 | 显示全部楼层
傻眼貓咪 发表于 2022-5-16 10:06
建议不要这样写代码,我也没有看过有人这样写代码。你的问题出在s.index(2) 已经不是原来的 s.index(2) 了 ...

谢谢,我本来也是这样写,只是突发奇想。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-16 14:35:19 | 显示全部楼层
Twilight6 发表于 2022-5-16 10:08
没想到这样还会有不同的输出结果,我的理解是:

等号左边的元素赋值是基于新生成的列表,而等号右边的 ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 20:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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