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

python中普通引号和反引号的区别,python,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]] 谁能告诉我为什么 >>> '[[0]*2]*2' '[[0]*2]*2' >>> `[[0]*2]*2` '[[0, 0], [0, 0]]' 第一个是文本,第二个立即计算到数据结构中,并返回其文本表示形式“[[0,0],[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]
,但都是单独的对象。修改其中一个对象对另一个对象没有影响,因为它们不是同一个对象

eval(`[[0]*2]*2`)
顺便说一句,多年来一直强烈反对使用
”。你不能用
`
引用东西。它用于创建某些Python对象的字符串表示形式

`hi mom`

是一个语法错误。

值得注意的是,此反引号语法已从Python 3中删除。请改用
repr()
。重要的是,在Python中,“反引号”根本不是引号——它们是jsut,相当于对“repr”的调用——但其中的任何内容都是执行的“实时代码”。是的,这很奇怪,它在新版本中被删除了。应该避免使用反引号。