Python:本地人的奇怪行为()
我在Python中遇到了一个内置函数locals()的奇怪行为。很难准确解释,但请看一段代码: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
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实现,所以没有。