python 列表切片赋值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 列表切片赋值相关的知识,希望对你有一定的参考价值。

对列表切片进行赋值,解释器处理时是直接将序列中的内容赋值过去的 ,还是先将不是列表的序列转成列表再进行赋值的呢?

切片赋值,得到的与原变量无关,是两个不同的对象;直接赋值,引用的是同一个对象。
请看下例
1、直接赋值。
a=[0,2,3,0]
b=a
print b
del(a[1])
print b
这样写得到的结果是:
[0, 2, 3, 0]
[0, 3, 0]

2、切片赋值。
a=[0,2,3,0]
b=a[:]
print b
这样写得到的结果是
del(a[1])
print b
[0, 2, 3, 0]
[0, 2, 3, 0]
是不一样吧?

3、现对它们的id做一下输出就会发现问题所在;
(1)直接赋值得到的id是一样的:
[0, 2, 3, 0]
[0, 3, 0]
id(b): 83565448 id(a): 83565448
(2)切片赋值得到的id:
[0, 2, 3, 0]
[0, 2, 3, 0]
id(b): 83250504 id(a): 83250056追问

额 我是不表达的有问题。
我的意思是列表切片在左
比如 a=[1,2,3,4,5,6]
a[3:]='abc'
这个在处理时会不会类似于C中 如double a=5 这样出现类型不匹配,解释器处理时会不会先把赋值号右边的转成列表['a','b','c']再进行赋值处理呢

参考技术A 列表切片转换成新列表追问

我的意思是列表切片在左
比如 a=[1,2,3,4,5,6]
a[3:]='abc'
这个在处理时会不会类似于C中 如double a=5 这样出现类型不匹配,系统处理时会不会先把赋值号右边的转成列表['a','b','c']再进行赋值处理呢

追答

如果能自动转换,肯定会转换,如果是不能转换的类型如double,就会出现错误

在numpy中为多个切片赋值

【中文标题】在numpy中为多个切片赋值【英文标题】:Assign value to multiple slices in numpy 【发布时间】:2013-04-23 08:56:47 【问题描述】:

在Matlab中,你可以给同一个列表的多个切片赋值:

>> a = 1:10

a =

     1     2     3     4     5     6     7     8     9    10

>> a([1:3,7:9]) = 10

a =

    10    10    10     4     5     6    10    10    10    10

如何在 Python 中使用 numpy 数组做到这一点?

>>> a = np.arange(10)

>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

>>> a[1:3,7:9] = 10
IndexError: too many indices

【问题讨论】:

您有什么理由希望在一个语句中而不是在两个语句中执行它? @SukritKalra 我不能代表问题作者发言,但一个例子是当一个人试图从这样一个多片中形成一个列表理解时(这就是我想要做的,也是我到达的原因这个问题) 【参考方案1】:

您也可以考虑使用np.r_

http://docs.scipy.org/doc/numpy/reference/generated/numpy.r_.html

ii = np.r_[0:3,7:10]
a[ii] = 10

In [11]: a
Out[11]: array([ 10, 10, 10,  3,  4,  5,  6, 10, 10,  10])

【讨论】:

【参考方案2】:
a = np.arange(10)
a[[range(3)+range(6,9)]] = 10
#or a[[0,1,2,6,7,8]] = 10 

print a

我认为这应该可行......我不知道这正是你想要的

【讨论】:

没有 NumPy 可以实现吗? 确实如此。 NumPy 是真正的单线之王。【参考方案3】:

来自http://docs.scipy.org/doc/numpy/user/basics.indexing.html(“索引数组”部分)。请注意,所需切片的索引应包含在“np.array()”中。

>>> x = np.arange(10,1,-1)
>>> x
array([10,  9,  8,  7,  6,  5,  4,  3,  2])

>>> x[np.array([3, 3, 1, 8])]
array([7, 7, 9, 2])

【讨论】:

以上是关于python 列表切片赋值的主要内容,如果未能解决你的问题,请参考以下文章

切片整个列表的切片赋值和直接赋值有啥区别?

Python:通过引用传递和切片赋值

Python中列表/字符串切片slice?

Python列表赋值

python基础之切片列表id值变化

在numpy中为多个切片赋值