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”的调用——但其中的任何内容都是执行的“实时代码”。是的,这很奇怪,它在新版本中被删除了。应该避免使用反引号。