我在研究格式化方法时遇到了这个事情:
test = 'Name'
exec('{0} = {1}'.format(test, 10))
a = Name # Python жалуется на Unresolved reference 'Name' При этом код воспроизводится без ошибок.
print(a) # Вывод: 10 Где в данный момент хранится переменная Name?
print(Name-5) # Вывод: 5
print(test) # Вывод: 'Name'
第一个问题是,它是什么以及为什么它有效?这是使用 % 格式的类似条目:
exec('%s = %d' % (test, 10)) # Работает так же как и метод .format() - без проблем.
但由于某种原因,使用 f 格式的类似条目不再有效:
exec(f'{(test := 10)}') # Эквивалентная запись с помощью f-форматирования выдаёт NameError: name 'Name' is not defined. Did you mean: 'name'? То есть как и должно работать.
实际上,第二个问题是,在重现上述代码时,f 字符串与其他类型的格式化有何不同?为什么这里不起作用?
我们尽量不这样做
exec
,而是打印你的行。最后我们还将打印变量的值test
:结论:
哦,多么有趣。前两个
exec
执行该动作Name = 10
。最后一个执行操作将其结果转换为字符串后exec
返回的操作。test := 10
如果你写了test = 10
,你会立即明白错误是什么。我怀疑您就是这样做的,并且只是在将其更改=
为后:=
,因为这就是错误中的工具提示中所写的内容:也就是说,这里先完成操作
test := 10
,然后通过“海象运算符”从这次赋值中获得的内容尝试通过 执行exec
。顺便说一句,目前尚不清楚您是如何在这一行中遇到“Name”错误的。请提供错误的完整跟踪,我被模糊的怀疑所困扰,您的代码在某种程度上与此错误有所不同。变量的当前内容
test
根本不参与此操作,因此“Name”无处可来。让我总结一下。无论您如何生成字符串,使用什么格式样式,
exec
如果字符串相同,它的工作方式总是相同的。没有奇迹。但运营商的工作方式略有x = y
不同x := y
。并且在显示变量时不能在 f 行中编写常规赋值。但如果你做出与之前相同的行,那么一切都会相同,请参阅strawdog的评论。