Python中普通引号和反引号的区别

5
如果我写下

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个回答

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

6
值得注意的是,这种反引号语法在Python 3中已被删除,请改用 repr() - Tim Pietzcker
2
值得一提的是,在Python中,“反引号”根本不是引号 - 它们只是对“repr”的调用等效方式 - 但是其中的任何内容都是被执行的“活代码”。 是的,这很奇怪,并且在较新版本中已经被删除。 应避免使用反引号。 - jsbueno

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`

是一个语法错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接