如果我写
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 :(得分:14)
>>> '[[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]]
。
答案 1 :(得分:5)
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`
是语法错误。