如果我写下
a=eval('[[0]*2]*2')
a[0][0]=1
a
会变成[[1,0],[1,0]]
如果我写
a=eval(`[[0]*2]*2`)
a[0][0]=1
a
会变成[[1,0],[0,0]]
有人能告诉我为什么吗?
a=eval('[[0]*2]*2')
a[0][0]=1
a
会变成[[1,0],[1,0]]
如果我写
a=eval(`[[0]*2]*2`)
a[0][0]=1
a
会变成[[1,0],[0,0]]
有人能告诉我为什么吗?
>>> '[[0]*2]*2'
'[[0]*2]*2'
>>> `[[0]*2]*2`
'[[0, 0], [0, 0]]'
第一个是文本,第二个立即转换为数据结构并返回其文本表示形式'[[0, 0], [0, 0]]'
。
[[0]*2]*2
的问题在于它会被计算为对同一对象的引用列表。这就是为什么你会得到[[1,0],[1,0]]
而不是[[1,0],[0,0]]
。eval('[[0]*2]*2')
这将产生评估Python代码[[0]*2]*2
的结果。将列表相乘会生成一个具有多个对原始对象的引用的列表。结果列表是[x, x]
,其中每个x
都是类似于[0, 0]
的列表。修改其中一个子列表会同时修改两个子列表,因为它们是同一对象。
eval(`[[0]*2]*2`)
这里使用内部的[[0]*2]*2
创建了上述内容,然后创建它的字符串表示形式(因为反引号),即[[0,0],[0,0]]
,然后创建将其作为Python代码求值的结果。这一次,两个子列表是单独的列表,每个都看起来像[0,0]
,但是它们是不同的对象。修改其中一个不会影响另一个,因为它们不是同一个对象。
顺便说一下,多年来强烈不建议使用``
。你无法用``
引用任何东西。它用于创建某些Python对象的字符串表示形式。
`hi mom`
是一个语法错误。
repr()
。 - Tim Pietzcker