Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python名称在全局变量上与___Python_Cpython_Name Mangling - Fatal编程技术网

Python名称在全局变量上与__

Python名称在全局变量上与__,python,cpython,name-mangling,Python,Cpython,Name Mangling,当我用\uuuu创建一个模块级变量并试图在类的方法中访问它时(使用global关键字),出现了名称混乱 让我举一个例子: __test = 'asd' # module level variable with __ class TestClass(object): def test(self): global __test print(__test) # trying to access this variable a = TestClass(

当我用
\uuuu
创建一个模块级变量并试图在类的方法中访问它时(使用
global
关键字),出现了名称混乱

让我举一个例子:

__test = 'asd'  # module level variable with __


class TestClass(object):
    def test(self):
        global __test
        print(__test)  # trying to access this variable


a = TestClass()
a.test()
解释器引发了一个错误:

name错误:未定义名称“\u TestClass\u test”

我们可以看到,它试图将mangle
\uuu test
命名为
\utestclass\uu test

我认为名称混乱应该只用于类变量(当我使用
self
或类名访问它们时)

这是一种我没有意识到的定义良好的行为,还是某种Python bug

我在CPython3.5上测试了它

格式为
\u spam
的任何标识符(至少两个前导下划线, 最多一个尾随下划线)以文本形式替换为
\u classname\uu spam
,其中
classname
是带前导下划线的当前类名。这种破坏是不加考虑地进行的 到标识符的语法位置,只要它出现 在类的定义中


(来自,emphasis mine)

为什么要创建“带有
\uuu
的模块级变量”?请特别注意,正如文档中引用的“这一混乱是在不考虑标识符的语法位置的情况下完成的”实际上是我的一个学生(我在一些初学者级别上教授python)我应该先检查文档:Psee:我认为这是一个bug,因为人们有理由认为,当显式使用
global
关键字时,会得到全局变量。即使它记录了它的高度不一致和不合逻辑。@con-f-use这是一个哲学问题,规范中的错误是否是错误。;)我同意可能有更好的方法来避免与子类的名称冲突。我的问题不是真正的名称冲突,而是
global
是一个更强的“哲学”概念,因为它在这里有明确的说明。此外,据我所知,global的文档中没有提到在任何地方工作,除了类内变量名以
\uuuu
..@con-f开头(但不是结尾)之外。我的意思是,我所看到的名称混乱的唯一目的是避免子类中的名称冲突。