从列表中更改复制值的ID

时间:2014-04-07 14:43:11

标签: python copy

我复制了一个列表的一个元素,但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]。身份不同。

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

>>> 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 :(得分:-1)

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

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])