最近在看<<流畅的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. PhpStorm之服务器篇

    打开编辑器,依次点击 Tools->Deloyment->Configuration,进入连接服务器的配置页面 2.点击左上角的 + ,配置一个新的服务器 3.填写添加之后服务器的名称,并 ...

  2. CentOS 7 设置系统语言为英文并解决 cannot change locale 问题

    首次安装Cent OS 7.6时,将系统语言设置成了中文.后续学习和使用过程中却发现种种不便,甚至有翻译错误.为锻炼自己的英文能力,所以将系统语言设置问英文. 编辑 locale 配置文件,将 LAN ...

  3. Charles对移动APP抓包(https)

    1.下载安装Charles 2.设置代理 (1)查看默认端口:Proxy->Proxy Settings  在这个页面会看到HTTP Proxy的默认端口是8888 (2)查看当前电脑的IP:H ...

  4. Hdu 4725 The Shortest Path in Nya Graph (spfa)

    题目链接: Hdu 4725 The Shortest Path in Nya Graph 题目描述: 有n个点,m条边,每经过路i需要wi元.并且每一个点都有自己所在的层.一个点都乡里的层需要花费c ...

  5. Planning CodeForces - 854C

    Planning CodeForces - 854C 题意:有n架航班,第i架原先的时候是在第i分钟起飞的.现在前k分钟无法有飞机起飞,因此需要调整安排表,延后飞机起飞.仍然要求每一分钟只有一架飞机起 ...

  6. ACM_求第k大元素(两次二分)

    求第k大 Time Limit: 6000/3000ms (Java/Others) Problem Description: 给定两个数组A和B,大小为N,M,每次从两个数组各取一个数相乘放入数组C ...

  7. 学好Mac常用命令,助力iOS开发

    原文出处: Jack_lin(@Jack_Lin_IOS ) 厚重·技术 序言 在iOS开发的过程中,更多地注重iOS开发的效率,熟练使用Mac终端操作的常用命令,可以让你更好的游刃于iOS繁重的开发 ...

  8. Unity基础知识

    hierarchy视图选中,点击scene视图,按f键聚焦 persp相当于是透视视野 在persp模式下,物体在scene界面上所呈现的画面是给人一种距离摄像头近的物体显示的大,距离摄像头远的物体显 ...

  9. C#基础学习2

    变量与数据类型!

  10. P1664 每日打卡心情好

    题目背景 在洛谷中,打卡不只是一个简单的鼠标点击动作,通过每天在洛谷打卡,可以清晰地记录下自己在洛谷学习的足迹.通过每天打卡,来不断地暗示自己:我又在洛谷学习了一天,进而帮助自己培养恒心.耐心.细心. ...