Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么不';在string.format()字典引用中是否需要?_Python_Python 3.x_Dictionary_String Formatting - Fatal编程技术网

Python 为什么不';在string.format()字典引用中是否需要?

Python 为什么不';在string.format()字典引用中是否需要?,python,python-3.x,dictionary,string-formatting,Python,Python 3.x,Dictionary,String Formatting,我们可以看到,我们需要'Bibi'来引用键'Bibi'的值。但如果要在.format()中使用相同的格式,则会出现以下错误: my_dic={"Vajk":"vékony","Bibi":'magas'} my_dic['Bibi'] 'magas' 为什么第一个不起作用,第二个为什么起作用?它应该是相反的,第一个应该有效,第二个不应该 它应该是相反的,第一个应该有效,第二个不应该 不,不应该这样做,因为双引号字符串中的'Bibi'是引号字符串,而不仅仅是Bibi。您可以通过以下方式进行检查:

我们可以看到,我们需要'Bibi'来引用键'Bibi'的值。但如果要在.format()中使用相同的格式,则会出现以下错误:

my_dic={"Vajk":"vékony","Bibi":'magas'}
my_dic['Bibi']
'magas'
为什么第一个不起作用,第二个为什么起作用?它应该是相反的,第一个应该有效,第二个不应该

它应该是相反的,第一个应该有效,第二个不应该

不,不应该这样做,因为双引号字符串中的
'Bibi'
是引号字符串,而不仅仅是
Bibi
。您可以通过以下方式进行检查:

print("úgy érzem, hogy Bibi nagyon {0[Bibi]}".format(my_dic))
úgy érzem, hogy Bibi nagyon magas
如果在第一种情况下,钥匙是
“'Bibi'”
,那么它工作得很好:

In [51]: "'Bibi'" == "Bibi"
Out[51]: False

在第一种情况下,Python不接受“Bibi”,也没有给出预期结果的原因是Python在字典的括号内查找所有内容,在这种情况下,括号内有
“Bibi”
,而不是
“Bibi”

,首先,一些术语:

  • 'Bibi'
    是一种字符串文字,用于创建字符串值的语法。键是字符串,使用字符串文字可以指定其中一个键

    你可以用一个变量来代替;将变量指定为字符串值,并使用该变量从字典中获取项目:

    In [49]: my_dic={"Vajk":"vékony","'Bibi'":'magas'}
    
    In [50]: print("úgy érzem, hogy Bibi nagyon {0['Bibi']}".format(my_dic))
    úgy érzem, hogy Bibi nagyon magas
    
  • 在字符串格式中,
    {…}
    是替换字段。
    str.format()
    方法为替换字段提供值

  • 替换字段语法中的
    0[Bidi]
    部分是字段名。在字段名中使用
    […]
    时,它是一个复合字段名(有多个部分)。
    […]
    语法通常称为索引

字段名中使用的格式刻意保持简单,并且只与Python类似。对语法进行了简化,以限制其用途,将功能限制在通常可以安全使用的范围内

同样,如果使用复合名称和getitem
[…]
索引语法,则名称将被视为字符串,但不使用引号来创建字符串。无论如何,您不能传入变量名,不需要在
'name'
(字符串)和
name
(变量)之间进行对比

换句话说,在Python表达式中,
my_dic[foo]
通过查找变量
foo
的值来工作,这与使用类似于
my_dic['Bidi']
的字符串文本是不同的概念。但是不能在字段名中使用变量。在
str.format()
操作中,使用
{0[foo]}
永远不会找到变量
foo

原文解释为:

与其他一些编程语言不同,您不能在格式字符串中嵌入任意表达式。这是经过设计的——您可以使用的表达式类型是经过刻意限制的。只支持两个运算符:“.”(getattr)运算符和“[]”(getitem)运算符。允许这些操作的原因是,它们在非病理代码中通常没有副作用

应该注意的是,在格式字符串中使用“getitem”比其常规用法更为有限。在上面的示例中,字符串“name”实际上是文本字符串“name”,而不是名为“name”的变量。解析项键的规则非常简单。如果它以一个数字开头,那么它将被视为一个数字,否则它将被用作一个字符串

保持语法简单可以使模板更加安全。从:

除此之外,下一个最好的方法是确保字符串格式没有副作用。由于Python的开放性,不可能保证任何非平凡操作都具有此属性。此PEP所做的是将格式字符串中的表达式类型限制为那些可见副作用很少见且Python开发人员文化强烈反对的类型

允许
{0[foo]}
在当前范围内查找变量很容易产生副作用,而将
foo
视为字符串则意味着您可以确定地知道,它始终是字符串
'foo'

如果您只使用字符串文字而不是动态值(因此
'some{}template'.format(…)
而不是
some_variable.format(…)
),并且您使用的是Python 3.6或更新版本,那么您可以改为使用,因为您可以使用完整的Python表达式:

foo = 'Bibi'  # or read this from a file, or from a network connection
print(my_dic[foo])  # -> magas

f
字符串中,您使用实际的Python表达式而不是字段名,因此再次使用引号来传递字符串文字。因为它们是字符串文字,所以会在定义它们的位置对它们进行计算,作为开发人员,您可以看到哪些局部变量可用,所以您可能知道如何保持安全。

Because占位符引用不是Python语法。它们类似于Python,并且针对模板编写器。只是澄清一下:
'
是一个引号。
'value'
是一个字符串文本。您还可以使用变量获取值:
foo='Bibi'
my_dic[foo]
foo = 'Bibi'  # or read this from a file, or from a network connection
print(my_dic[foo])  # -> magas
print(f"úgy érzem, hogy Bibi nagyon {my_dic['Bibi']}")