【问题标题】:Change id of copied value from a list从列表中更改复制值的 id
【发布时间】:2014-05-19 21:19:41
【问题描述】:

我复制了列表的一个元素,但 id 仍然相同。

t=['bancorp', 'bancorp','bancorp ba','bancorp ali', 'gas eu', 'gas', 'karl', 'bancorp','bancorp america','uni','gas for','gas tr']

n=t[2]

id(n)
124661664

id(t[2])
124661664

我试过了,但 ID 还是一样:

n=cp.deepcopy(t[2])

如何使用不同的 ID 复制值?

编辑:

当我切片时:n=t[2:3][0]。 id不一样。

但是当我切片时:n=t[0:1][0]。身份证是一样的。为什么会这样?

【问题讨论】:

  • 字符串是不可变的,所以复制它们从来没有用处。你想做什么?
  • 我想要一个列表元素的独立副本,所以ID应该不同。检查我的编辑。
  • @CreamStat “独立副本”在这里不相关,因为字符串是不可变的;你不能就地改变它们。
  • @Creamstat 但为什么呢?拥有相同字符串的两个副本没有任何好处。
  • 这与想要数字 2 的多个副本一样有意义。

标签: python copy


【解决方案1】:

如果你真的决定创建一个单独的字符串副本,你可以这样做:

>>> s = 'foo'
>>> t = ''.join(s)
>>> s
'foo'
>>> t
'foo'
>>> id(s) == id(t)
False

但是,由于字符串是不可变的(即不能就地更改),因此您并没有真正从中获得任何好处。例如:

>>> a = list('foo')
>>> a
['f', 'o', 'o']
>>> b = a[:] # only a shallow copy
>>> id(a[0]) == id(b[0])
True # share the same object
>>> a[0] += 'l' # 'modify' one of them
>>> a
['fl', 'o', 'o'] # changes a
>>> b
['f', 'o', 'o'] # doesn't change b

【讨论】:

    【解决方案2】:

    在 python 中,较小的字符串是interned。这允许有效的内存使用,因为字符串是不可变的。简而言之,对于小的相同字符串,您将获得相同的 id 值。

    至于为什么 t[2:3][0] 没有被实习,而t[0:1][0] 被实习,看起来 Cython 不实习带有空格的字符串。

    【讨论】:

    • 那么,我有没有办法获得列表中第一个值的独立副本?
    【解决方案3】:

    创建一个空列表并尝试复制

    t=['bancorp', 'bancorp','bancorp ba','bancorp ali', 'gas eu', 'gas', 'karl', 'bancorp','bancorp america','uni','gas for','gas tr']
    n = []
    n = t[2:3]
    
    print id(n)
    
    print id(t[2])
    

    【讨论】:

    • 不是很有用 - 这里n 是一个空列表,它(虽然它没有与t[2] 相同的ID)不是OP 想要的。 t[2:3] 将给出一个包含单个元素 t[2] 的列表,但 id(t[2:3][0]) == id(t[2])
    • 只要print n 你就会明白我的意思了。
    • 为什么当 n=t[0:1][0] 时它不起作用?那样的话,ID还是一样的!
    • @MONTYHS id(n) != id(t[2]) 因为['bancorp ba'] != 'bancorp ba' 请注意id(n[0]) == id(t[2])
    猜你喜欢
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    相关资源
    最近更新 更多