对此存在一些困惑。考虑一下这段代码。
>>> 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
如果f
和g
是不同的对象,那么它们的内部元素如何指向相同的内存位置?
答案 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