最近在看<<流畅的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 变量引用的更多相关文章

  1. Python变量引用

    >>>a=3 >>>b=a >>>a=4 >>>b >>>3 >>>List1=[1,2,3 ...

  2. Python 再谈变量作用域与变量引用

    再谈变量作用域与变量引用 by:授客 QQ:1033553122 module3.py #!/usr/bin/env python # -*- coding:utf-8 -*-   __author_ ...

  3. Python中的变量引用对象需注意的几点

    Python中的变量引用对象需注意的几点 分类:Python (55)  (0) 普通引用: Python中,变量的作用仅仅是一个标识,只有赋值后才被创建,它可以引用任何类型的对象,而且在引用之前必须 ...

  4. python变量、对象和引用你真的明白了吗

    python变量.对象和引用你真的明白了吗 变量.对象和引用 Python不像C++,Java等语言一样,他们可以不用事先声明变量类型而直接对变量进行赋值.对Python语言来讲,对象的类型和内存都是 ...

  5. Python 变量 对象 引用

    1.变量 变量第一次赋值时被创建,变量在使用前必须赋值 变量本身没有类型,变量类型为它引用的对象类型: 变量在使用时被替换成它引用的对象 2.对象 对象本身具有计数和类型,变量引用对象,当对象的引用变 ...

  6. python 中变量引用问题

    普通变量,如a=10,str="fdaf",它们在函数内的值是不会被带到函数外的,除非在函数内加上global,而引用是惰性原则,从最近的同名父级同名变量引用值 其它变量如列表,字 ...

  7. Python变量、数据类型6

    1.Python变量 变量,即代表某个value的名字. 变量的值存储在内存中,这意味着在创建变量时会在内存中开辟一个空间. !!!即值并没有保存在变量中,它们保存在计算机内存的深处,被变量引用.所以 ...

  8. C与Python变量的区别

    C中变量有类型,代表一定内存. 而Python变量只是封装过的指针,没有类型.如果不指向对象,就没有意义,更谈不上类型. python中 a=b,和C中 a=b是完全不同的两个操作.前者只是指针(引用 ...

  9. python——变量

    参考资料: Python程序设计与实现 变量名的命名规则 仅仅由大.小写英文字母,下划线(_),数字(不可作为变量名的开头)组合而成: 不能使用Python关键字和函数名作为变量名: 变量名不能包含空 ...

随机推荐

  1. 利用jenkins和docker实现持续交付

    利用jenkins和docker实现持续交付 一.什么是持续交付 让软件产品的产出过程在一个短周期内完成,以保证软件可以稳定.持续的保持在随时可以发布的状况.它的目标在于让软件的构建.测试与发布变得更 ...

  2. <TLE>奇偶剪枝hdoj1010

    (奇偶剪枝)转自百度百科,讲的非常棒: http://baike.baidu.com/link?url=3g5bW7LszRVOVvFDFp6cL0ZZnAaOLUdpaNjc2leHoxkKU9Eh ...

  3. (数位DP)51NOD 1042 数字0-9的数量

    给出一段区间a-b,统计这个区间内0-9出现的次数. 比如 10-19,1出现11次(10,11,12,13,14,15,16,17,18,19,其中11包括2个1),其余数字各出现1次.   输入 ...

  4. Linux下自动还原MySQL数据库的Shell脚本

    创建shell脚本topjui_source.exp,内容如下: #!/usr/bin/expect spawn echo "###### running... ######" s ...

  5. python界面工具pyqt基础教程

    这里有一份很详细的中文翻译供我们学习pyqt,很适合初学者和中级学者,直接丢传送门,不多说 http://www.qaulau.com/books/PyQt4_Tutorial/introductio ...

  6. SQL - nulls值排序问题

    给字段排序时遇到的null值问题 当我们使用order by来为指定的字段进行排序时,如果db中该字段的值存在着null值,那么在排序时这些null值会不会参与排序呢?如果参与排序的话,又是以怎样的标 ...

  7. ForeignKeyConstraint 外键约束的使用及作用的学习[转]

    原文链接 da.SelectCommand.CommandText="select au_id,au_fname,au_lname from authors"; da.Fill(d ...

  8. 三色灯渐变DIY制作

    小编前几天查资料,怎么使用12864屏幕的用法,突然发觉微博是个好东西,随着自己的成长,学习了很多的知识,没有做笔记的习惯,只是习惯把用到的硬件,传感器,资料写到程序的备注内,但感觉,用到时不是那么方 ...

  9. .net core跨域设置

    services.AddCors(options => options.AddPolicy("AllowSameDomain", builder => builder. ...

  10. P1984 [SDOI2008]烧水问题

    题目描述 把总质量为1kg的水分装在n个杯子里,每杯水的质量均为(1/n)kg,初始温度均为0℃.现需要把每一杯水都烧开.我们可以对任意一杯水进行加热.把一杯水的温度升高t℃所需的能量为(4200*t ...