为了账号安全,请及时绑定邮箱和手机立即绑定

关于切片的应用

哪位大牛帮我解释一下,为什么以下两个函数得到的结果不一样?


name = "Ronaldo"

ln=list(name)


函数一:

def R1(r):

    r[-1:],r[0:-1] = r[0:-1],r[-1:]

>>> R1(ln)

>>> ln

['o', 'd']


函数二:

def R2(r):

    r[0:-1],r[-1:] = r[-1:],r[0:-1]

>>> R2(ln)

>>> ln

['o', 'R', 'o', 'n', 'a', 'l', 'd']


正在回答

2 回答

特意运行了一下

R1函数:这句r[-1:],r[0:-1] = r[0:-1],r[-1:]其实是先后执行以下两步:

1、r[-1:]=r[0:-1]  #先把“Ronaldo”变成“RonaldRonald”,存在内存里,r这个时候还是“Ronaldo”,还没有赋值为“RonaldRonald”

2、r[0:-1]=r[-1:] #再把“RonaldRonald”变成“od”,因为r还是“Ronaldo”,所以取'o'替换“RonaldRonald”中的“RonaldRonal”

执行完之后r才赋值为“od”

R2函数:也是相当于执行两步:

1、r[0:-1]= r[-1:] # 先把“Ronaldo”变成“oo”,r依然是“Ronaldo”

2、r[-1:] =r[0:-1]# 再把“oo”变成“oRonald”

0 回复 有任何疑惑可以回复我~
#1

悟空不会金箍棒 提问者

非常感谢!
2017-10-15 回复 有任何疑惑可以回复我~
#2

悟空不会金箍棒 提问者

我还是有个疑惑,既然r一直没变,那么在R1函数的第二步中,r[0:-1] = r[-1:]这个等式的左侧r[0:-1]应该等于"Ronald",右侧r[-1:] = "o",两者一交换就是"oRonald"了呀。
2017-10-15 回复 有任何疑惑可以回复我~
#3

慕粉9965376 回复 悟空不会金箍棒 提问者

这一步的r[0:-1]应该是“RonaldRonal”
2017-10-16 回复 有任何疑惑可以回复我~

根据你的想法我做了如下实验

name = "Ronaldo"

ln=list(name)

ln[-1:],ln[0:-1],ln[:1] = ln[0:-1],ln[-1:],ln[:1]

print ln

>>> 'R','d'

由这个可以看出,“=”号前面是取内存里面的ln,后面是取原来的ln

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
初识Python
  • 参与学习       758623    人
  • 解答问题       8667    个

学python入门视频教程,让你快速入门并能编写简单的Python程序

进入课程

关于切片的应用

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信