python 变量引用

Posted Chim

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 变量引用相关的知识,希望对你有一定的参考价值。

最近在看<<流畅的python>>关于变量引用部分时,有一些自己的看法,就再次记录一下.

问题:

# From flunet python example 8-8
class Bus:
    def __init__(self, passengers=[]):
        self.passengers = passengers

    def pick(self, name):
        self.passengers,append(name)
    
    def remove(self, name):
        self.passengers.remove(name)

>> bus1 = Bus()    # 实例化
>> bus2 = Bus()    # 实例化
>> bus1.append(Bob)
>>bus2.passengers    # bus2的passengers也有值     
 [Bob]  

为什么bus1中passengers发生改变会导致bus2中passengers发生改变?

这说明两个Bus的实例共用了一个self.passengers,明明是两个实例?

在往上看,self.passengers引用的是passengers的值,也就是__init__中的形参(变量).这个参数在两个实例中是共用的,实例化的过程中,都会用到passengers这个list.

再仔细想一想,每一次实例化过程不都会新建一个passengers吗?这就是问题的所在.答案是passengers这个形参并不是在实例化过程中建立的,而是在方法定义的时就产生了.也就是因为在这个过程早于实例化过程,不同的实例才能共享passengers变量.

再定义一个函数:

def foo(x=[]):
    print id(x)

>> f1 = foo()
139916453629536
>> f2 = foo()
139916453629536

两次id是一样的,也说明参数x的内存空间是在函数定义时创建的

看看foo函数的默认参数变量以及id

>> foo.func_defaults
([],)
>> id(foo.func_defaults[0])
139916453629536

可以看到id的结果都是一样的,同样也验证了参数变量的内存空间是在调用之前(定义时)创建的.

回头看看,除了参数变量的引用之外,还有几点看法:

(1)方法和函数的参数引用方式是一致的,都是在定义时创建内存空间

(2)函数也是function类的实例

 

以上是关于python 变量引用的主要内容,如果未能解决你的问题,请参考以下文章

返回C ++引用变量的做法是邪恶的吗?

Fragments RecyclerView Databinding Kotlin - 未解析的引用变量名称

python 引用全局变量之global

在 SQLite3 DELETE 语句中引用 python 变量

在python中赋值之前引用的局部变量'form'

python程序员的基本素养--你从没见过的Python变量引用