Python 变量作用域和类

标签 python python-2.7

在 Python 中,如果我定义一个变量:

my_var = (1,2,3)

并尝试在类的__init__ 函数中访问它:

class MyClass:
    def __init__(self):
        print my_var

我可以访问它并打印 my_var 而无需声明 (global my_var)。

但是,如果我将 my_var 放在 class MyClass 之后,我会收到范围错误 (未找到全局变量)

这是什么原因?我应该怎么做?我在哪里可以阅读这方面的知识来学习?我确实阅读了 Python 类页面,但没有遇到它的解释。

谢谢

最佳答案

补充@mgilson 的回答: 请注意,Python 类变量在类实例之间共享。而且这种行为可能非常出乎意料并且看起来很奇怪。在实践中它是这样工作的:

class MyClass(object):
    my_var = 10

    def __init__(self):
        print(self.my_var)


m1 = MyClass()
print(m1.my_var)
>>> 10          # this is fine

MyClass.my_var = 20
print(m1.my_var)
>>> 20          # WTF? :) --> shared value

m2 = MyClass()
print(m2.my_var)
>>> 20          # this is expected

m1.my_var = 30
print(MyClass.my_var)
>>> 20          # this is also expected

MyClass.my_var = 40 
print(m1.my_var)
>>> 30           # But WHY? Isn't it shared? --> 
                 # The value WAS shared until m1.my_var = 30 has happened.

print(m2.my_var)
>>> 40           # yep m2.my_var's value is still shared :)

关于Python 变量作用域和类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12941748/

相关文章:

python - 为什么 Python 中的 08 或 09 无效?

python - PyMySQL 是否得到很好的支持?它比 MySQLdb 慢吗?

python - 如何使用 fill_value 对 pandas 中的 TimeSeries 进行重新采样?

具有多个列表和 if else 条件的 Python 列表理解

python - Openpyxl比较两个工作表中的值以查看值是否不存在

django - 使用 pip install 出现异常

python - 在 Python 中导入模块时出现段错误

python-2.7 - 从 。导入非线性不能导入名称非线性

Python2 with Beautiful Soup - 使用多个 CSS 类过滤元素

python - 如何在python中执行系统命令后的下一行