Python中名称和字符串之间可延展性的来源是什么?

Python中名称和字符串之间可延展性的来源是什么?,python,Python,我习惯于在编程语言中严格区分标识符(变量名)和字符串 然而Python在两者之间有一定的延展性。例如在代码中 import networkx as nx G = nx.Graph() G.add_edge(1, 2, food='eggs') for node1, node2, data in G.edges(data=True): print(data['food']) 我们在第3行使用food作为标识符,然后在第5行检索属性时使用字符串'food' 我想更好地了解正在发生的事情。编

我习惯于在编程语言中严格区分标识符(变量名)和字符串

然而Python在两者之间有一定的延展性。例如在代码中

import networkx as nx
G = nx.Graph()
G.add_edge(1, 2, food='eggs')
for node1, node2, data in G.edges(data=True):
    print(data['food'])
我们在第3行使用
food
作为标识符,然后在第5行检索属性时使用字符串
'food'

我想更好地了解正在发生的事情。编程语言和Python的哪些特性使这种可塑性成为可能

(请注意,NetworkX是这个问题的附带问题,这就是为什么我没有在关键字中列出它。)

澄清为什么这个问题不需要解释,而且表面上与:

有时发生的事情是非常清楚的。例如,如果我们使用代码

(以我们喜欢的顺序使用关键字参数),Python解释器将看到名称(而不是字符串)
bar
baz
,并且从此期望名称(而不是字符串)
bar
baz
,以任何顺序

但在其他情况下,这种延展性确实令人费解。例如,在解释关键字参数的代码中

def my_function(**kwargs):
    print str(kwargs)

my_function(a=12, b="abc")

{'a': 12, 'b': 'abc'}
我们在函数调用中引入关键字参数,只是为了发现它们已经变成字符串

从一个问题到现在的问题

>>> d = dict(food='eggs')
>>> d['food']
'eggs'
很明显,在Python中,
d1
d2
之间没有任何区别,无论我们是否编写:

d1 = {'food':'eggs'}

d1发生的事情完全有道理。
'food'
的类型是一个字符串

但是,同样,
d2
是模糊的。虽然我们最终得到的结果完全相同,但该语言以某种方式将我们使用的标识符/名称(
食品
)塑造成一个字符串


编程语言(尤其是Python)的什么特性允许语言将名称模制成字符串?现在出现了一种模式,可能是Python使用某种机制将名称转换为字符串,但没有将字符串转换为标识符的实例吗?

这种行为的一个简单示例是字典:

>>> d = dict(food='eggs')
>>> d['food']
'eggs'
这些只是一种语法糖,允许传递任意参数,以便在被调用函数中通过名称访问它们,如:

def func(**kwargs):
    return kwargs['food']

>>> func(food='eggs')
'eggs'

这不是一个真正的字符串,而是一个键。问题是什么样的语言功能使得可以使用
add_edge(food='egs')
,然后使用
data['food']
中的字符串键检索信息。答案是关键字参数<调用
add_edge
中的code>food
是一个关键字参数,因此该函数在一个字典中检索它,该字典以字符串
food
为键。因此,它可以在实现端做任何事情,使其成为
edges()
中的字典。这与这个网络库或其他什么都没有关系,只是关键字参数,这是链接问题的一个很好的复制品。所以我们取消了这个问题,这个问题被复制成了一个关于关键字参数的问题,这样三个用户就可以提供一个解释关键字参数的答案了?“但是,同样,d2是模糊的。”–不太可能。将关键字参数传递给接受
**kwargs
的函数时,所有无关参数都会放入字典
kwargs
。参数名称自动成为所述字典的键
food
in
dict(food='eggs')
从来都不是标识符(就像变量名一样),它只是参数的名称。和参数名称是字符串。另请参见:
>>> d = dict(food='eggs')
>>> d['food']
'eggs'
def func(**kwargs):
    return kwargs['food']

>>> func(food='eggs')
'eggs'