Python:本地人的奇怪行为()

Python:本地人的奇怪行为(),python,locals,Python,Locals,我在Python中遇到了一个内置函数locals()的奇怪行为。很难准确解释,但请看一段代码: def Main(): def F(l=locals()): print 'F', id(l), l a= 100 F() print '1', id(locals()), locals() F() 在本地函数F中,我将locals()分配到l中作为机柜的默认值。由于locals()是一个dict,它的引用被复制到l。所以最后三行应该有相同的结果 但结果是这样的: F 1398

我在Python中遇到了一个内置函数locals()的奇怪行为。很难准确解释,但请看一段代码:

def Main():
  def F(l=locals()):  print 'F', id(l), l
  a= 100
  F()
  print '1', id(locals()), locals()
  F()
在本地函数
F
中,我将
locals()
分配到
l
中作为机柜的默认值。由于
locals()
是一个
dict
,它的引用被复制到
l
。所以最后三行应该有相同的结果

但结果是这样的:

F 139885919456064 {}
1 139885919456064 {'a': 100, 'F': <function F at 0x7f39ba8969b0>}
F 139885919456064 {'a': 100, 'F': <function F at 0x7f39ba8969b0>}
F 139885919456064{}
139885919456064{'a':100'F':}
F 139885919456064{'a':100,'F':}
三个
print
语句几乎同时被调用,
locals()
id
l
是相同的,但是
F
中使用的第一个
l
没有内容

我不明白为什么会这样。有人能解释这种现象吗?或者这是一个已知/未知的bug

非常感谢

如果您阅读
locals
函数的

更新并返回表示当前本地符号表的字典。在函数块中调用自由变量时,它由locals()返回,而不是在类块中

locals();它还更新dict以反映当前的局部变量值。

如果您阅读
局部变量函数的

更新并返回表示当前本地符号表的字典。在函数块中调用自由变量时,它由locals()返回,而不是在类块中


locals();它还更新dict以反映当前的局部变量值。

可能重复的No,它不能解释这种现象。
F
中的
l
locals()
应该具有相同的id,但不应该具有相同的内容。如果在
F
中调用
locals()
则会得到不同的结果,但因为对
locals()
的所有三个调用都在
Main
中(因为定义在Main内,所以默认参数在该范围内求值)它们提供相同的词典它们实际上是相同的词典,因为它们的ID是相同的。但是它们的内容不同。这是我无法理解的问题。好的,很抱歉造成混淆,您可以通过执行
saved=locals()
并稍后打印出来获得相同的行为,无需添加额外的上下文来混淆(me)人。收回我的接近票。可能重复否定,这不能解释这种现象。预计
F
中的
l
locals()
具有相同的id,但不希望它们没有相同的内容。如果调用
locals()
F
的内部,您会得到不同的结果,但是由于对
locals()
的所有三个调用都在
Main
内部(因为定义在Main内部,所以默认参数在该范围内求值)它们提供相同的词典它们实际上是相同的词典,因为它们的ID是相同的。但是它们的内容不同。这是我无法理解的问题。好的,很抱歉造成混淆,您可以通过执行
saved=locals()
并稍后打印出来获得相同的行为,无需添加额外的上下文来混淆(我)人们。收回我的投票。现在我清楚地了解了上述行为。我认为类似于
全局变量
局部变量
为我们提供了直接访问局部变量字典的途径。除了直接访问函数中的局部变量字典之外,还有其他途径吗?@Akihiko:局部变量实际上不存在y是用dict实现的,所以没有。现在我清楚地了解了上述行为。我认为类似于
全局变量
局部变量
为我们提供了直接访问局部变量字典的途径。除了直接访问函数中的局部变量字典之外,还有其他途径吗?@Akihiko:局部变量实际上不是用dict实现,所以没有。