列表中的别名

时间:2017-07-13 07:08:40

标签: python

对此存在一些困惑。考虑一下这段代码。

>>> g=[[10]*3]*3
>>> f=[[10,10,10]]*3
>>> id(g)==id(f)
False
>>> id(g[0][0])==id(f[0][0])
True

另外,请考虑这段代码。

>>> g=[['Aamir']*3]*3
>>> f=[['Aamir','Aamir','Aamir']]*3
>>> id(g)==id(f)
False
>>> id(g[0][0])==id(f[0][0])
True

如果fg是不同的对象,那么它们的内部元素如何指向相同的内存位置?

2 个答案:

答案 0 :(得分:5)

随着您的问题不断发展,不同的迭代需要不同的答案:

None

None is a singleton,因此对它的所有引用都引用同一个对象并具有相同的地址。这意味着,对于给定的Python进程,id(None)始终返回相同的值。这也意味着我们可以使用None运算符测试is

<expression> is None

字符串

字符串受interning约束,其中解释器折叠相同的字符串文字以节省存储空间。有关详情,请参阅Python string interning

这种情况实现的方式意味着如果我们用一个涉及变量的表达式替换其中一个文字,你的字符串示例会中断:

>>> aami='Aami'
>>> g=[[aami+'r']*3]*3
>>> f=[['Aamir','Aamir','Aamir']]*3
>>> id(g)==id(f)
False
>>> id(g[0][0])==id(f[0][0])
False

整数

有趣的是,CPython还选择实习小整数:

>>> x=1
>>> y=1
>>> x is y
True
>>> x=100000
>>> y=100000
>>> x is y
False

"is" operator behaves unexpectedly with integers中的更多内容。

具体来说,这意味着如果我们用更大的整数来尝试它,你的第一个例子就会中断:

>>> g=[[100000]*3]*3
>>> f=[[100000,100000,100000]]*3
>>> id(g)==id(f)
False
>>> id(g[0][0])==id(f[0][0])
False

答案 1 :(得分:3)

因为None不会改变住房。每个None对象都具有相同的位置。尝试

>>>check = None
>>>id(check) == id(f[0][0])

你会得到:

>>>True