PyCharm(Python 3.6)控制台中的全局变量值



我是Python和PyCharm的新手,所以请原谅我的无知。

我试图在初始化类时了解函数的执行——特别是,如果传递到新实例中,我想重用数据库连接对象,但如果没有,我想创建一个。我有一个创建连接的函数get_cnx()。我发现,无论是在__init__语句中使用默认参数来调用get_cnx():

def __init__(self, db_cnx=get_cnx())

或者是否使用关键字参数:

self.db_cnx = kwargs.get('db_cnx', get_cnx())

无论传入的连接参数的存在(或内容(如何,函数都会执行。这使重新使用连接的对象失败,所以我恢复到if条件。我相信有一种方法可以通过装饰师来做到这一点,但那感觉就像给莉莉镀金。

无论如何,这就是我实际问题的背景:为了帮助我弄清楚发生了什么,我创建了这个简单的测试,作为一个名为"classes.py"的模块:

greeting = 'Good Day'

def my_func():
global greeting
greeting = 'Changed'
return 'Hello'

class Animal:
def __init__(self, greet):
if not greet:
self.greet = my_func()
else:
self.greet = greet

if __name__ == '__main__':
cat = Animal(None)

如果我运行这个模块(在配置中选中了"run with Python console"(,我会看到全局变量greeting以蓝色显示为"Changed",这正是我所期望的。

如果我将最后一位更改为:

if __name__ == '__main__':
cat = Animal('Wotcha')

我看到蓝色显示的全局变量是"Good Day",这也是我所期望的。

然而,当我在控制台中键入以下内容时:

dog = Animal(None)

全局变量名称变为红色,但仍显示"Good Day"。

同样,使用PyCharm控制台也可以做同样的事情:

>>> print(greeting)
Good Day
>>> dog = Animal(None)
>>> print(greeting)
Good Day

现在,我将模块加载到IDLE中,并点击F5(运行模块(,然后在控制台中执行以下操作:

>>> greeting
'Good Day'
>>> dog = Animal(None)
>>> greeting
'Changed'

这是我期望在PyCharm控制台中看到的。

有人能解释一下发生了什么吗?这可能是一个bug,还是我对PyCharm处理范围的方式缺乏理解?还是我对执行范围缺乏更广泛的理解?

谢谢!!

JetBrains为我打开了一份错误报告,确认行为与预期不符。

最新更新