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

对整个列表进行切片的切片分配与直接分配之间有什么区别?

对整个列表进行切片的切片分配与直接分配之间有什么区别?

Cats萌萌 2019-10-12 10:01:45
我在很多地方看到对lists 使用切片分配。与(非默认)索引一起使用时,我能够理解它的用法,但是我无法理解其用法,例如:a_list[:] = ['foo', 'bar']有什么不同a_list = ['foo', 'bar']?
查看完整描述

3 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

区别是相当大的!在


a_list[:] = ['foo', 'bar']

您修改绑定到名称的现有列表a_list。另一方面,


a_list = ['foo', 'bar']

为名称分配一个新列表a_list。


也许这会有所帮助:


a = a_list = ['foo', 'bar'] # another name for the same list

a_list = ['x', 'y'] # reassigns the name a_list

print a # still the original list


a = a_list = ['foo', 'bar']

a_list[:] = ['x', 'y'] # changes the existing list bound to a

print a # a changed too since you changed the object


查看完整回答
反对 回复 2019-10-12
?
HUH函数

TA贡献1836条经验 获得超4个赞

通过分配给a_list[:],a_list仍引用相同的列表对象,但内容已修改。通过分配给a_list,a_list现在引用一个新的列表对象。


查看其id:


>>> a_list = []

>>> id(a_list)

32092040

>>> a_list[:] = ['foo', 'bar']

>>> id(a_list)

32092040

>>> a_list = ['foo', 'bar']

>>> id(a_list)

35465096

如您所见,它id不会随切片分配版本而改变。


两者之间的不同可能导致完全不同的结果,例如,当列表是函数的参数时:


def foo(a_list):

    a_list[:] = ['foo', 'bar']


a = ['original']

foo(a)

print(a)

与此同时,a也进行了修改,但是如果  a_list = ['foo', 'bar']改用了它,则a保留其原始值。


查看完整回答
反对 回复 2019-10-12
  • 3 回答
  • 0 关注
  • 943 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信