Python 在方法内的%time语句中定义的变量在该语句之后不可访问

Python 在方法内的%time语句中定义的变量在该语句之后不可访问,python,python-2.7,ipython,Python,Python 2.7,Ipython,这似乎很有效- %time a = "abc" print(a) CPU times: user 0 ns, sys: 0 ns, total: 0 ns Wall time: 19.1 µs abc 这不会- def func(): %time b = "abc" print(b) func() CPU times: user 0 ns, sys: 0 ns, total: 0 ns Wall time: 31 µs --------------------------

这似乎很有效-

%time a = "abc"
print(a)

CPU times: user 0 ns, sys: 0 ns, total: 0 ns
Wall time: 19.1 µs
abc
这不会-

def func():
    %time b = "abc"
    print(b)

func()

CPU times: user 0 ns, sys: 0 ns, total: 0 ns
Wall time: 31 µs
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-8-57f7d48952b8> in <module>()
      3     print(b)
      4 
----> 5 func()

<ipython-input-8-57f7d48952b8> in func()
      1 def func():
      2     get_ipython().magic(u'time b = "abc"')
----> 3     print(b)
      4 
      5 func()

NameError: global name 'b' is not defined
def func():
%时间b=“abc”
印刷品(b)
func()
CPU时间:用户0纳秒,系统0纳秒,总计0纳秒
壁时间:31µs
---------------------------------------------------------------------------
NameError回溯(最近一次呼叫上次)
在()
3印刷品(b)
4.
---->5 func()
在func()中
1 def func():
2 get_ipython().magic(u'time b=“abc”)
---->3印刷品(b)
4.
5 func()
NameError:未定义全局名称“b”
这里有一个链接到

我使用的是Python2.7,还没有在python3上试用过


这是预期的行为吗?

我几乎可以肯定这是一个IPython bug

[31]中的
:def func():
…:a=2
…:%时间b=1
…:打印(局部变量())
…:打印一份
…:打印b
在[32]:func()中
CPU时间:用户3µs,系统:0 ns,总计:3µs
壁时间:6.2µs
{'a':2,'b':1}
2.
---------------------------------------------------------------------------
NameError回溯(最近一次呼叫上次)
在()
---->1 func()
在func()中
4打印(局部变量())
5.打印a
---->6打印b
7.
8.
NameError:未定义全局名称“b”

它在Python 3中工作,如果您在等号后编写
%time
,如下所示:

def func():
    a = 2
    b = %time 1
    print(locals())
    print(a)
    print(b)

func()
输出:

CPU times: user 6 µs, sys: 0 ns, total: 6 µs
Wall time: 10.3 µs
{'a': 2, 'b': 1}
2
1

非常感谢你的回答。这里引用takluyver在github问题上的回应——抱歉,这是Python工作方式的一个长期限制。局部变量不像全局变量那样从字典中查找,因此动态执行的代码修改局部名称空间并不像您期望的那样工作。因此,我认为最好的解决方法是
b=locals()['b']
print(b)
请参见以下github讨论:
CPU times: user 6 µs, sys: 0 ns, total: 6 µs
Wall time: 10.3 µs
{'a': 2, 'b': 1}
2
1