差异正常引用和python中的反引号

时间:2012-02-03 09:30:23

标签: python

如果我写

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]]

谁能告诉我为什么?

2 个答案:

答案 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],但是是单独的对象。修改其中一个对另一个没有影响,因为它们不是同一个对象。

BTW,多年来一直强烈建议不要使用``。您无法使用``实际引用。它用于创建某些Python对象的字符串表示形式。

`hi mom`

是语法错误。