gpt4 book ai didi

python - python 中的切片 - 它是一个副本还是一个指针?

转载 作者:太空狗 更新时间:2023-10-29 21:26:37 25 4
gpt4 key购买 nike

>>> a = [3, 2]
>>> a[0:1][0] = 1
>>> a
[3, 2]

>>> a[0:1] = [1]
>>> a
[1, 2]

什么是a[0:1]什么意思?

  1. 如果它是指向a 范围的指针, 然后 a[0:1][0] = 1应更改 a 的值.
  2. 如果它是a 范围的副本, 然后 a[0:1] = [1]不应更改 a 的值.

我认为两者的结果是不一致的。你能帮我解决这个问题吗?

最佳答案

在内部,这是一个很大的区别:

>>> a = [3, 2]
>>> a[0:1][0] = 1

的简写
temp = a[0:1]
temp[0] = 1

内部表示为

a.__getitem__(slice(0, 1)).__setitem__(0, 1)

回复

temp = a.__getitem__(slice(0, 1))
temp.__setitem__(0, 1)

因此它访问列表的一部分,创建一个单独的对象,并对该对象进行赋值,然后将其删除。

另一方面,

>>> a[0:1] = [1]

a.__setitem__(slice(0, 1), [1])

它只是对原始对象进行操作。

因此,虽然看起来相似,但这些表达的含义却截然不同。

让我们测试一下:

class Itemtest(object):
def __init__(self, name):
self.name = name
def __repr__(self):
return self.name
def __setitem__(self, item, value):
print "__setitem__", self, item, value
def __getitem__(self, item):
print "__getitem__", self, item
return Itemtest("inner")

a = Itemtest("outer")
a[0:1] = [4]
temp = a[0:1]
temp[0] = 4
a[0:1][0] = 4

输出

__setitem__ outer slice(0, 1, None) [4]
__getitem__ outer slice(0, 1, None)
__setitem__ inner 0 4
__getitem__ outer slice(0, 1, None)
__setitem__ inner 0 4

关于python - python 中的切片 - 它是一个副本还是一个指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23029073/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com