Discuss / Python / 杂例

杂例

Topic source

Robert_LoL

#1 Created at ... [Delete] [Delete and Lock User]
L = list(range(10))
L[1:2] = [11, 22, 33, 44, 55]
print(L, 'with len =', len(L))

结果是[0, 11, 22, 33, 44, 55, 2, 3, 4, 5, 6, 7, 8, 9] with len = 14。 好奇做了这个例子。

不过,用L[::2] = []或者L[::2] = [1, 2, 3]这样不一样尺寸的赋值会出错。

试了试

L = list(range(10))
L[::2] = [-i for i in L[::2]]
print(L, 'with len =', len(L))

这个是可以的,结果是[0, 1, -2, 3, -4, 5, -6, 7, -8, 9] with len = 10

请问为什么结果是[0, 1, -2, 3, -4, 5, -6, 7, -8, 9]呢?

林金壕

#3 Created at ... [Delete] [Delete and Lock User]

[-i for i in L[::2]] 是列表生成式生成的list, [0, -2, -4, -6, -8]. 然后切片操作符相当于循环对L赋值,就是[0, 1, -2, 3, -4, 5, -6, 7, -8, 9]了

能不能在详细说下 实在是 有点笨拙

原来(L[::2]) 结果是[0, 2, 4, 6, 8] L[::2] = [-i for i in L[::2]] 的结果是把(L[::2])对应的值的取负,返回[0, -2, -4, -6, -8] 那么原来的L是[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 把L[::2]取负后,L就变成了[0, 1, -2, 3, -4, 5, -6, 7, -8, 9] :)

L[1:2]不是只单个元素吗,对应这里的L值应该是1,为什么在第一个例子里可以对他赋一个list呢?

言草容忧

#7 Created at ... [Delete] [Delete and Lock User]

list中元素的类型可以不同,他这样做就是传入一个list替换L[1]的值

eleven_刁

#8 Created at ... [Delete] [Delete and Lock User]

L = list(range(10)) L [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] L[::2] [0, 2, 4, 6, 8]

L[::2] = [-i for i in L[::2]] 等式右边等同于 for i in L[::2] -i 所以等式右边是把L[::2]里的每个元素取反,再合成一个新的list,[0, -2, -4, -6, -8] 那就是L[::2] = [0, -2, -4, -6, -8] 就是对L[::2]赋值,L其余值不变 则L = [0, 1, -2, 3, -4, 5, -6, 7, -8, 9]


  • 1

Reply