方法中的Python局部变量

时间:2014-08-15 17:04:23

标签: python oop python-3.x

我正在学习Python 3,我在Python中有关于面向对象编程的基本问题。这是我的代码。

class pet:
    number_of_legs = 0
    def count_legs(self):
        print("I have %s legs" %dog.number_of_legs)

dog = pet()
dog.number_of_legs = 4
dog.count_legs()

此代码打印:

I have 4 legs

为什么count_legs方法不会出现类似"未知变量狗的错误。" 变量狗存在于课外。

此代码的工作原理如何?这种行为背后的动机是什么?

1 个答案:

答案 0 :(得分:10)

dog在运行时被查找为全局 ;如果您以不同的方式命名变量, 会抛出错误:

>>> class pet:
...     number_of_legs = 0
...     def count_legs(self):
...         print("I have %s legs" %dog.number_of_legs)
... 
>>> cat = pet()
>>> cat.number_of_legs = 4
>>> cat.count_legs()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in count_legs
NameError: name 'dog' is not defined
>>> dog = cat
>>> cat.count_legs()
I have 4 legs

这样可以很容易地引用以后定义的模块中的其他全局变量;这个包含递归函数:

def fib(n):
    if n <= 1: return n
    return fib(n - 1) + fib(n - 2)

定义fib()时,没有全局名称fib 尚未;只有在创建了功能对象时才添加全局。如果名称必须存在 first ,您最终会得到如下代码:

fib = None  # placeholder for global reference

def fib(n):
    if n <= 1: return n
    return fib(n - 1) + fib(n - 2)

那只是噪音。