对此有一些困惑.考虑一下这段代码.
>>> g=[[10]*3]*3
>>> f=[[10,10,10]]*3
>>> id(g)==id(f)
False
>>> id(g[0][0])==id(f[0][0])
True
Run Code Online (Sandbox Code Playgroud)
另外,请考虑这段代码.
>>> g=[['Aamir']*3]*3
>>> f=[['Aamir','Aamir','Aamir']]*3
>>> id(g)==id(f)
False
>>> id(g[0][0])==id(f[0][0])
True
Run Code Online (Sandbox Code Playgroud)
如果f和g是不同的对象,那么如何才能自己内心的元素指向同一个内存位置?
随着您的问题不断发展,它的不同迭代需要不同的答案:
NoneNone 是单例,因此对它的所有引用都引用相同的对象并具有相同的地址.这意味着,对于给定的Python进程,id(None)始终返回相同的值.这也意味着我们可以测试None使用is运算符:
<expression> is None
Run Code Online (Sandbox Code Playgroud)
字符串需要实习,其中解释器折叠相同的字符串文字以节省存储空间.更多关于Python字符串实习的内容.
这种实现的方式意味着如果我们用一个涉及变量的表达式替换其中一个文字,你的字符串示例就会中断:
>>> 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
Run Code Online (Sandbox Code Playgroud)
有趣的是,CPython还选择实习小整数:
>>> x=1
>>> y=1
>>> x is y
True
>>> x=100000
>>> y=100000
>>> x is y
False
Run Code Online (Sandbox Code Playgroud)
更多关于"is"操作符的操作在整数上表现出意外.
具体来说,这意味着如果我们用更大的整数来尝试它,你的第一个例子就会中断:
>>> g=[[100000]*3]*3
>>> f=[[100000,100000,100000]]*3
>>> id(g)==id(f)
False
>>> id(g[0][0])==id(f[0][0])
False
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
109 次 |
| 最近记录: |