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

Python 3.x PyCharm(Python 3.6)控制台中的全局变量值,python-3.x,scope,pycharm,global-variables,Python 3.x,Scope,Pycharm,Global Variables,我对Python和PyCharm都是新手,所以请原谅我的无知 在初始化类时,我试图让自己了解函数的执行——具体来说,如果传递到一个新实例中,我想重用一个数据库连接对象,但如果没有,我想创建一个数据库连接对象。我有一个创建连接的函数get\u cnx()。我发现,无论是在语句中使用默认参数调用get\u cnx(): …或是否使用关键字参数: self.db_cnx = kwargs.get('db_cnx', get_cnx()) …无论传入的连接参数是否存在(或内容),函数始终会执行。取消了

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

在初始化类时,我试图让自己了解函数的执行——具体来说,如果传递到一个新实例中,我想重用一个数据库连接对象,但如果没有,我想创建一个数据库连接对象。我有一个创建连接的函数
get\u cnx()
。我发现,无论是在
语句中使用默认参数调用
get\u cnx()

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

self.db_cnx = kwargs.get('db_cnx', get_cnx())
…无论传入的连接参数是否存在(或内容),函数始终会执行。取消了重新使用连接的目标,因此我返回到
if
条件。我相信有一种方法可以让一个装饰师做到这一点,但那感觉就像给礼来镀金一样

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

如果我运行这个模块(在配置中选中了“runwithpythonconsole”),我会看到全局变量
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已经为我打开了一个bug报告-确认行为不符合预期。

可能已经回答了我自己的问题,从最上面的(优秀的)答案来看:。当你在PyCharm中“运行”一个模块时,它实际上是在“从导入*”,而在IDLE中“运行”一个模块就像是在解释器中逐行执行代码。这解释了全局变量的行为,这些变量实际上是在执行点创建的变量的副本。编辑上述内容-说“运行”相当于导入的
*
,可能不准确。如果是,它将不会执行
If uuuuu name uuuu='\uuuuu main uuu'
块,当然它会执行。但这就好像,一旦执行了该命令并使控制台保持运行,后续的解释器命令就不会引用模块全局变量,而是引用在某个时间点获取的变量副本(就好像它已经从import*
执行了
)。
>>> print(greeting)
Good Day
>>> dog = Animal(None)
>>> print(greeting)
Good Day
>>> greeting
'Good Day'
>>> dog = Animal(None)
>>> greeting
'Changed'